如何将Azure DevOps流水线任务变量传递到Terraform代码中使用
问题排查
你的配置存在3个核心错误:
- 流水线变量跨阶段传递配置错误。你当前用
##vso[task.setvariable variable=pitr_time;]$iso8601_time设置的变量默认仅支持当前阶段内的后续任务调用,无法直接传递到下游的DeployInfraPOC阶段,需要给setvariable指令添加isOutput=true标记将其声明为阶段输出变量。 - Terraform环境变量映射规则错误。Terraform读取
TF_VAR_*前缀的环境变量时,会自动去掉前缀匹配变量名,比如你设置了环境变量TF_VAR_PITR,会自动匹配Terraform中名为pitr的变量,你现在在variables.tf中定义的变量名为TF_VAR_PITR,需要匹配的环境变量名应为TF_VAR_TF_VAR_PITR,这是映射不匹配的核心问题。 - 下游阶段引用上游输出变量的语法错误。上游阶段的输出变量不能直接用
$(pitr_time)引用,需要通过$[stageDependencies.<上游阶段名>.<上游作业名>.outputs['<任务名>.pitr_time']]的语法引用。
修复方案
第一步:修改PowerShell任务,声明为输出变量
给PowerShell任务设置唯一名称,同时给setvariable指令添加isOutput=true标记:
- task: PowerShell@2 name: GetPITRTime # 必须设置任务名,后续引用输出变量需要 inputs: targetType: 'inline' script: | $iso8601_time = Get-Date -Format "o" echo "##vso[task.setvariable variable=pitr_time;isOutput=true]$iso8601_time" displayName: "Get point-in-time record before launching migration"
第二步:修正Terraform变量定义
去掉variables.tf中变量名的TF_VAR_前缀,和环境变量映射规则对齐:
variable "pitr" { description = "Point-in-time restore timestamp." type = string }
同步修改main.tf中的变量引用:
resource "azurerm_mssql_database" "mssqldb" { name = "db-bkup-temp-pitr" server_id = data.azurerm_mssql_server.mssqlsrv.id create_mode = "PointInTimeRestore" creation_source_database_id = "/subscriptions/##############" restore_point_in_time = var.pitr }
第三步:修正下游阶段的变量引用逻辑
按Azure DevOps跨阶段变量引用规则,调整DeployInfraPOC阶段的变量定义(请把下面代码中的BuildJob替换为你上游BuildInfraPOC阶段的实际作业名):
- stage: DeployInfraPOC dependsOn: BuildInfraPOC variables: env: poc # 按实际的上游阶段名、作业名、任务名替换对应占位符 TF_VAR_pitr: $[stageDependencies.BuildInfraPOC.BuildJob.outputs['GetPITRTime.pitr_time']] jobs: - template: templates/deploy-infra.yml parameters: env: poc armServiceConnection: "Service connection devops" projectRoot: $(System.DefaultWorkingDirectory) planArtifactName: "pitr-database-migration-poc-$(Build.BuildId).tfplan"
优化方案
如果不需要在流水线其他位置复用该时间戳,可以直接把时间生成逻辑放到Terraform代码内实现,省去流水线变量传递的复杂度:
locals { pitr_time = timestamp() # 直接生成符合要求的ISO8601格式时间戳,和PowerShell生成的格式完全兼容 } resource "azurerm_mssql_database" "mssqldb" { name = "db-bkup-temp-pitr" server_id = data.azurerm_mssql_server.mssqlsrv.id create_mode = "PointInTimeRestore" creation_source_database_id = "/subscriptions/##############" restore_point_in_time = local.pitr_time }
内容的提问来源于stack exchange,提问作者PrayingMantis
相关产品推荐
相关产品推荐

