如何将Terraform输出的app_name作为Azure DevOps部署阶段输入变量?
解决Azure DevOps中Terraform输出变量传递到部署阶段的问题
方案一:让Terraform任务自动生成TF_OUT前缀变量
你当前使用custom命令执行output并定向到文件,这不会触发任务自动生成TF_OUT_前缀的环境变量。要自动生成这类变量,需改用任务内置的output命令,而非custom命令:
- task: TerraformTaskV4@4 name: terraformOutput inputs: provider: 'azurerm' command: 'output' # 替换为内置output命令,而非custom workingDirectory: '$(Pipeline.Workspace)' environmentServiceNameAzureRM: service_connection outputTo: 'variable' # 输出目标设为变量,触发TF_OUT_前缀变量生成
配置完成后,Terraform输出的app_name会自动转为$(TF_OUT_app_name)变量,可直接在后续部署阶段使用。
方案二:读取output.json文件并设置跨阶段变量
若需保留输出到文件的配置,可按以下步骤读取文件并传递变量:
确认output.json路径
你的任务中workingDirectory为$(Pipeline.Workspace),fileName为output.json,因此文件绝对路径为$(Pipeline.Workspace)/output.json。直接使用该路径比依赖任务输出变量更可靠。读取文件并设置作业级变量
在bash任务中读取app_name,并设为作业级变量,供同阶段后续任务使用:- bash: | WEBAPP_NAME=$(cat $(Pipeline.Workspace)/output.json | jq '.app_name.value' -r) echo "##vso[task.setvariable variable=WEBAPP_NAME;]$WEBAPP_NAME" displayName: '读取Terraform输出的app_name'跨阶段传递变量
若要将变量传递到后续部署阶段,需在当前阶段声明输出变量:stages: - stage: Terraform_Apply jobs: - job: Run_Terraform steps: # 你的Terraform执行任务 - bash: | WEBAPP_NAME=$(cat $(Pipeline.Workspace)/output.json | jq '.app_name.value' -r) echo "##vso[task.setvariable variable=WEBAPP_NAME;isOutput=true;]$WEBAPP_NAME" name: SetAppNameVar # 必须为任务命名,用于后续引用 outputs: WEBAPP_NAME: $[ job.Run_Terraform.SetAppNameVar.WEBAPP_NAME ] - stage: Deploy dependsOn: Terraform_Apply variables: APP_NAME: $[ stageDependencies.Terraform_Apply.Run_Terraform.outputs['WEBAPP_NAME'] ] jobs: - job: Deploy_App steps: - script: echo "部署应用: $(APP_NAME)"
注意事项
- 确保Terraform配置中已正确定义
app_name输出:output "app_name" { value = azurerm_app_service.example.name } - 若代理池中未安装jq工具,需在bash任务前先安装:
sudo apt-get install jq -y(适用于Ubuntu代理)
内容的提问来源于stack exchange,提问作者devopsseeker
相关产品推荐
相关产品推荐

