上下文变量
注意:此页面是关于 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 虚拟机则是虚拟机名称。Host
、Port
、User
、Password
:Packer 用于访问机器的主机、端口、用户和密码。对于使用 shell 本地配置器连接正在被配置的实例运行 Ansible 或 Inspec 很有用。ConnType
:正在使用的通信器类型。例如,对于 SSH 通信器,该值会是ssh
。PackerRunUUID
:当前构建的唯一 ID。可用于指定构建制品。这方面的一个例子是多个构建同时运行产生相同的制品。可以通过使用构建的唯一 ID 为它们命名来区分这些制品。PackerHTTPIP
、PackerHTTPPort
和PackerHTTPAddr
:Packer 创建的文件服务器的 HTTP IP、端口和地址,用于将“http”目录中的项目提供给虚拟机。 HTTP 地址以IP:PORT
格式显示。SSHPublicKey
和SSHPrivateKey
:Packer 用于连接实例的公钥和私钥。这些对于 SSH 通信器是唯一的,使用其他通信器时不会设置。SSHPublicKey
和SSHPrivateKey
可以包含转义序列和特殊字符,因此它们的输出应该用单引号引起来以避免意外。例如:
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)}"]
}
对于特定于构建器的构建器变量,另请参阅构建器文档:
- Amazon EC2: chroot, EBS Volume, EBS, EBS Surrogate, Instance
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}"
}
}