如何从 terraform 状态设置打包程序变量

Posted

技术标签:

【中文标题】如何从 terraform 状态设置打包程序变量【英文标题】:How to set a packer variable from a terraform state 【发布时间】:2020-01-23 01:42:25 【问题描述】:

使用 openstack。我有两个步骤来使用打包器构建图像: (1) 基本上使用 terraform 创建基础设施,只是一个路由到互联网的网络和一些允许 SSH 的安全组 (2) 使用打包器构建镜像

问题是我需要将 terraform 构建的网络的 ID 提供给打包机。我可以通过检查状态文件手动执行此操作,但我想知道自动执行此操作的最佳做​​法是什么?

【问题讨论】:

【参考方案1】:

您可以使用terraform output 读取状态的输出。您可以将它们作为 Packer 变量传递,即

packer build -var network=$(terraform output network_uuid) template.json

【讨论】:

这正是我要找的,我完全错过了输出变量的机制以及如何查询它们。谢谢! 使用terraform output --raw 避免字符串变量周围出现虚假引号【参考方案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...>

【讨论】:

这也可以,但不能很好地集成到我的工作流程中。谢谢!【参考方案3】:

想将其作为建议添加到答案above,但编辑队列已满。然后单独添加。

如果您需要将所有变量从 terraform 输出传递到打包器的“输入”:

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

【讨论】:

以上是关于如何从 terraform 状态设置打包程序变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从 terraform 状态中删除资源?

如何从 Terraform 文件中的 Azure Devops 变量组调用环境变量?

如何使用 terraform 设置资源健康警报条件

如何将 Terraform 输出变量保存到 Github Action 的环境变量中

如何在 Terraform 中管理本地生成的有状态文件

如何在 Hashicorp Terraform 中配置环境变量