如何从 Terraform 状态设置 Packer 变量

6

使用OpenStack。我有一个用Packer构建镜像的两个步骤的过程: (1) 使用Terraform创建基础架构,基本上只是将网络路由到互联网,以及允许SSH的一些安全组。 (2) 使用Packer构建镜像

问题是我需要提供由Terraform构建的网络ID给Packer。我可以通过检查状态文件手动完成此操作,但我想知道自动化此过程的最佳实践是什么?

3个回答

9
你可以使用terraform output来读取状态输出,然后将其作为Packer变量传递。具体操作可参考此链接
packer build -var network=$(terraform output network_uuid) template.json

这正是我一直在寻找的,我完全忽略了输出变量的机制以及如何查询它们。谢谢! - julien forgeat
1
使用 terraform output --raw 命令可以避免字符串变量周围出现不必要的引号。 - hertzsprung

2
另一个建议:您可以从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...>

1
这也可以运行,但不太适合我的工作流程。谢谢! - julien forgeat

1

想作为一个建议添加到上面的答案中,但编辑队列已满。然后单独添加。

如果您需要将terraform输出的所有变量传递给packer的“input”:

packer build $(terraform output -json | jq -j -r 'to_entries[] | " -var \(.key)=\(.value | .value)"') template.pkr.hcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接