Azure DevOps管道向模板传变量被识别为字面量无法解析问题
问题原因
- 根本原因是Azure DevOps管道的变量解析时机不匹配:
- 你在模板中引用变量组的语法
- group: ${{ parameters.variableGroup }}使用的是${{ }}编译时表达式,这类表达式会在管道启动前的YAML编译阶段完成解析,这一步就会确定要加载的变量组名称。 - 你传参时使用的
$[variables.countryCode]、$(countryCode)都属于运行时变量语法,要等管道编译完成、正式运行阶段才会被解析为实际值。编译阶段系统无法识别运行时表达式,就直接把表达式当做字符串拼接进变量组名称,才会出现找不到Terraform $(countryCode) Development Environment变量组的报错。
- 你在模板中引用变量组的语法
- 你前置PowerShell任务能正常输出
countryCode的原因是:PowerShell任务属于运行时执行的步骤,此时运行时变量已经完成解析,所以可以正常拿到值。
解决方案
直接在给模板传参时,改用编译时语法引用countryCode变量即可,修改deploy.yml中调用模板的参数部分:
- stage: Plan_Dev jobs: - template: terraform-plan2.yml@templates parameters: # 用编译时语法${{ variables.countryCode }}替换原来的运行时语法 servicePrincipal: Development ${{ variables.countryCode }} stateFileName: "$(statefilename).tfstate" variableGroup: Terraform ${{ variables.countryCode }} Development Environment terraformVersion: '0.14.6' condition: ""
由于你定义countryCode时本身用的就是${{ if }}编译时条件判断,在YAML编译阶段countryCode的值就已经根据源分支确定为es/us/uk中的一个,直接用${{ variables.countryCode }}就可以在编译阶段拿到实际值,传给模板后就能匹配到正确的变量组。
内容的提问来源于stack exchange,提问作者Kieran James
相关产品推荐
相关产品推荐

