当命令打包程序build.json成功完成时,我将获得以下格式的输出ami id:
eu-central-1: ami-12345678
在我的变形变量variables.tf中,我需要指定源代码,区域等.这里的问题是我不想手动或多次指定它们.对于地区(我事先知道),这很容易,因为我可以在两种情况下使用环境变量,但是输出ami呢?有没有内置的方式链接这些产品或一些不那么黑客的做法呢?
编辑:任何可能感兴趣的人的黑客方法.在这个解决方案我在gres区域& ami来自打包输出,并在Perl中使用正则表达式将结果写入terraform.tfvars文件中:
vars=$(pwd)"/terraform.tfvars" packer build pack.json | \ tee /dev/tty | \ grep -E -o '\w{2}-\w+-\w{1}: ami-\w+' | \ perl -ne '@parts = split /[:,\s]+/,$_; print "aws_amis." . $parts[0] ." = \"" . $parts[1] . "\"\n"' > ${vars}
atlas_artifact
resource in Terraform读取ids再次退出以用于Terraform.
在这种情况下,您将从资源获取ids,而不是使用变量.
除了阿特拉斯,其他的选择是相当有限的,在某些情况下是黑客.
如果您想在没有任何外部服务的情况下执行此操作,那么您可以尝试使用local shell post-processor作为在您的工件上运行本地命令的方式,也可以使用the machine-readable output提取AMI ID并将其写入Terraform的变量文件.
另一个选择是编写自己的后处理器插件,与您已经使用的某些软件进行交互,作为Atlas的替代方案.例如,我的一些同事写了a post-processor to record artifacts as metadata in Buildkite,然后我们随后使用Buildkite API进行检索.这需要在Go中编写自定义代码.
在撰写Terraform 0.7版本的时候,它仍然在开发中,但是它计划包括一个新功能,可以直接查询EC2 API的AMI,这将会(如果确实为0.7),还可以进一步选择标记AMI与Packer,然后直接从EC2使用这些标签.这使用EC2本身作为“中间人”,这可能不那么尴尬,因为它已经涉及AMI的存储.