You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:57:03