Packer 变量(默认)语法

Packer Variable (default) Syntax

我继承了一个 Packer 项目,它在变量定义的“默认”字段中有一个奇怪的语法。我有一个 pkrvars 文件,我正在使用变量名称块(例如 sshkey、subscription_id 等)在其中分配变量。

#{variablename}# 语法的用途是什么?

我知道该团队正致力于使用 terraform 和 azure devops 自动化这些图像,但我的搜索还没有太多结果。我找到的打包程序文档和文章都使用 ${variablename} 语法来使用变量。我认为这是获取 azure devops 管道定义变量的一些语法,但希望找到一些文档来阅读它(并提高我的理解)。

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}#"
}

在 HCL2 语法 variable 中,声明包含各种参数,可以在 documentation 中查看。这个具体问题围绕 default 参数,它为 Packer 模板中的变量提供默认值。该值不能是动态表达式、插值等

在这种情况下,值是文字字符串,例如 #{sshkey}#。这表示文字字符串将作为变量的默认值传递,这几乎肯定会导致针对 source and/or build API 的运行时错误,因为值为一个占位符。在执行过程中,这些值都需要用 Packer 输入变量或变量文件替换。如果您使用的是 Azure DevOps,我将不得不假设这发生在将值或文件作为参数传递给 packer build 或其他 Packer 命令的管道中。

如果没有为每个参数输入值,这些 default 参数值当前会导致运行时错误,因为它们错误地导致变量被解释为可选而不是必需的。最佳实践将涉及删除这些 default 参数,这样如果缺少输入,Packer 将在 compilation/pre-check 期间而不是运行时出错。这将提高工作流效率和调试。

关于为什么将这些值存入 default 参数的最佳猜测可能是为了避免在 packer validate 期间作为 CI 或个人工作流程的一部分丢失变量输入错误。但是,如果 packer validate 在项目目录而不是特定模板上执行并且存在 *.pkrvars.hcl,或者如果提供文件作为变量文件的参数,那么 Packer 也会成功验证没有这些副作用的模板。