Packer变量default字段中#{变量名}#语法的作用是什么?
核心结论
你观察到的#{变量名}#语法不属于Packer原生语法,是Azure DevOps(ADO)流水线内置令牌替换功能的默认占位符格式,是原团队为适配流水线变量注入设计的预处理逻辑。
具体作用逻辑
- 这套占位符会在ADO流水线执行
packer build命令之前被处理:流水线的令牌替换任务会扫描指定的Packer模板文件,把所有符合#{XXX}#格式的占位符,替换为ADO流水线变量库、变量组、运行时参数中定义的同名变量的实际值。 - 给变量default字段设置该占位符的设计兼顾了本地调试和流水线运行两种场景:
- 本地调试时,你通过pkrvars文件传入的变量值优先级高于default值,Packer会直接使用你传入的有效值,不会触发占位符相关问题
- 流水线运行时如果没有传入pkrvars文件、或者专门预留这些变量走流水线注入,替换后的有效值会作为default值直接生效,无需额外传参
语法特性说明
- ADO令牌替换的默认边界符就是前缀
#{、后缀}#,中间的变量名匹配不区分大小写,这也匹配你给出的示例中subscription_id变量的占位符为#{subscriptionid}#的写法,只需要和ADO侧定义的变量名一致即可,不需要和Packer变量名完全对齐。 - 该替换逻辑对所有文本格式文件生效,包括Packer的HCL模板、Terraform配置文件、YAML配置文件等,只需在流水线任务中指定要做替换的文件路径即可自动执行。
你给出的示例就是该方案的典型实现:
variable "sshkey" { type = string default = "#{sshkey}#" } variable "subscription_id" { type = string default = "#{subscriptionid}#" } variable "tenant_id" { type = string default = "#{tenantid}#" } variable "vm_size" { type = string default = "#{vmsize}#" }
内容的提问来源于stack exchange,提问作者Emeria
相关产品推荐
相关产品推荐

