【发布时间】:2020-01-23 01:42:25
【问题描述】:
使用 openstack。我有两个步骤来使用打包器构建图像: (1) 基本上使用 terraform 创建基础设施,只是一个路由到互联网的网络和一些允许 SSH 的安全组 (2) 使用打包器构建镜像
问题是我需要将 terraform 构建的网络的 ID 提供给打包机。我可以通过检查状态文件手动执行此操作,但我想知道自动执行此操作的最佳做法是什么?
【问题讨论】:
使用 openstack。我有两个步骤来使用打包器构建图像: (1) 基本上使用 terraform 创建基础设施,只是一个路由到互联网的网络和一些允许 SSH 的安全组 (2) 使用打包器构建镜像
问题是我需要将 terraform 构建的网络的 ID 提供给打包机。我可以通过检查状态文件手动执行此操作,但我想知道自动执行此操作的最佳做法是什么?
【问题讨论】:
您可以使用terraform output 读取状态的输出。您可以将它们作为 Packer 变量传递,即
packer build -var network=$(terraform output network_uuid) template.json
【讨论】:
terraform output --raw 避免字符串变量周围出现虚假引号
另一个建议:你可以从 Terraform 调用 Packer。
resource "null_resource" "packer_runner" {
triggers = {
install_script = "${sha1(file("${path.module}/scripts/app/install.sh"))}"
packer_file = "${sha1(file("${path.module}/packer/packer.json"))}"
}
provisioner "local-exec" {
working_dir = "${path.module}"
command = "packer build -var 'ami_name=${var.ami_name}' -var 'aws_region=${var.aws_region}' -var 'network_id=${var.network_id}' -var -parallel-builds=1 ./packer/packer.json"
interpreter = ["PowerShell", "-Command"]
}
}
然后,在packer.json:
<...stuff...>
"provisioners": [
{
"type": "shell",
"inline": "/usr/bin/cloud-init status --wait"
},
{
"type": "shell",
"environment_vars": [
"NETWOR_ID={{user `network_id`}}"
],
"script": "./scripts/app/install.sh"
},
<...more stuff...>
【讨论】:
想将其作为建议添加到答案above,但编辑队列已满。然后单独添加。
如果您需要将所有变量从 terraform 输出传递到打包器的“输入”:
packer build $(terraform output -json | jq -j -r 'to_entries[] | " -var \(.key)=\(.value | .value)"') template.pkr.hcl
【讨论】: