上下文变量

原文


注意:此页面是关于 Packer 的 HCL2 模板的。 HCL2 模板最初作为 Beta 功能被 Packer 1.5 版引入。从 v1.7 开始,HCL2 支持不再处于测试阶段,并且是编写 Packer 配置的首选方式。对于稳定的旧风格配置语言,请参阅模板文档。从 v1.6.2 开始,您可以使用 hcl2_upgrade 命令将遗留的 JSON 模板转换为 HCL2 配置文件。

source 变量

在配置器和后处理器中可以访问 source 的名称和类型:

source "null" "first-example" {
  communicator = "none"
}

build {
  name = "roles"

  source "null.first-example" {
    name = "consul"
  }
  source "null.first-example" {
    name = "nomad"
  }
  source "null.first-example" {
    name = "vault"
  }
  sources = ["null.first-example"]

  provisioner "shell-local" {
    inline = ["echo ${source.name} and ${source.type}"]
  }
}

# This will echo something like:
#
# roles.null.consul: consul and null
# roles.null.nomad: nomad and null
# roles.null.vault: vault and null
# roles.null.first-example: first-example and null

build 变量

build 变量将允许我们访问构建器的连接信息和基本实例状态信息:

source "null" "first-example" {
  communicator = "none"
}

build {
  name = "my-build-name"
  sources = ["null.first-example"]

  provisioner "shell-local" {
    environment_vars = ["TESTVAR=${build.PackerRunUUID}"]
    inline = ["echo source.name is ${source.name}.",
              "echo build.name is ${build.name}.",
              "echo build.PackerRunUUID is $TESTVAR"]
  }
}

以下是可用 build 变量的列表:

  • name: 表示正在运行的构建块的名称。这与正在运行的 source 块的名称不同。
  • ID:表示正在配置的 VM。例如,如果是 Amazon 主机则是实例 ID;如果是 DigitalOcean 主机则是 Droplet ID;如果是 VMware 虚拟机则是虚拟机名称。
  • HostPortUserPassword:Packer 用于访问机器的主机、端口、用户和密码。对于使用 shell 本地配置器连接正在被配置的实例运行 Ansible 或 Inspec 很有用。
  • ConnType:正在使用的通信器类型。例如,对于 SSH 通信器,该值会是 ssh
  • PackerRunUUID:当前构建的唯一 ID。可用于指定构建制品。这方面的一个例子是多个构建同时运行产生相同的制品。可以通过使用构建的唯一 ID 为它们命名来区分这些制品。
  • PackerHTTPIPPackerHTTPPortPackerHTTPAddr:Packer 创建的文件服务器的 HTTP IP、端口和地址,用于将“http”目录中的项目提供给虚拟机。 HTTP 地址以 IP:PORT 格式显示。
  • SSHPublicKeySSHPrivateKey:Packer 用于连接实例的公钥和私钥。这些对于 SSH 通信器是唯一的,使用其他通信器时不会设置。 SSHPublicKeySSHPrivateKey 可以包含转义序列和特殊字符,因此它们的输出应该用单引号引起来以避免意外。例如:
  provisioner "shell" {
      inline = ["echo '${build.SSHPrivateKey}' > /tmp/packer-session.pem"]
  }

为了向后兼容,shell 中也可以使用 WinRMPassword ,尽管它与更通用的 Password 用起来没有什么不同。

所有 build 变量都可以搭配任意 HCL2 函数一起使用。将构建 ID 转为大写的示例:

  post-processor "shell-local" {
      inline = ["echo ${upper(build.ID)}"]
  }

对于特定于构建器的构建器变量,另请参阅构建器文档:

HCL2 的特殊 build 变量处于测试阶段;请在 GitHub 上的 Packer issues 上报告任何问题或请求。

Packer 版本

此变量设置为当前运行的 Packer 版本:

source "null" "first-example" {
  communicator = "none"
}

build {
  sources = ["null.first-example"]

  provisioner "shell-local" {
    inline = ["echo packer_version is '${packer.version}'"]
  }
}

如果您正在运行 Packer 的开发版本,版本变量将包含已发布的版本号、开发标志和当前的 git commit hash:

PACKER_LOG=0 packer build packer_version_demo.pkr.hcl
null.first-example: output will be in this color.

==> null.first-example: Running local shell script: /var/folders/8t/0yb5q0_x6mb2jldqq_vjn3lr0000gn/T/packer-shell083160352
    null.first-example: packer_version is 1.6.5-dev (a69392129+CHANGES)

如果您正在运行 Packer 的发布版本,则版本变量将仅包含发布的版本号:

PACKER_LOG=0 packer build packer_version_demo.pkr.hcl
null.first-example: output will be in this color.

==> null.first-example: Running local shell script: /var/folders/8t/0yb5q0_x6mb2jldqq_vjn3lr0000gn/T/packer-shell718995312
    null.first-example: packer_version is 1.6.5

确保用单引号将变量引起来以转义返回的字符串,否则如果您运行的是开发版本的 Packer 程序,则括号可能会被您的 shell 转义。

HCP Packer Iteration ID

如果您的构建将元数据推送到 HCP Packer 注册表,则此变量将设置为与此运行关联的 Iteration ID 的值:

source "amazon-ebs" "cannonical-ubuntu-server" {
  ami_name         = "packer-example"
  // ...
  run_volume_tags = {
    hcp_iteration_id = packer.iterationID
  }
}
==> vanilla.amazon-ebs.cannonical-ubuntu-server: Adding tags to source instance
    vanilla.amazon-ebs.cannonical-ubuntu-server: Adding tag: "Name": "Packer Builder"
    vanilla.amazon-ebs.cannonical-ubuntu-server: Adding tag: "hcp_iteration_id": "01FHGF3M2AK4TS6PCZES4VX5E7"

您还可以将此值添加到后处理器,例如添加到清单文件:

  post-processor "manifest" {
    output     = "manifest.json"
    strip_path = true
    custom_data = {
      iteration = "${packer.iterationID}"
    }
  }

results matching ""

    No results matching ""