对于一个不受支持的afaik场景,我有一个看似有用的用例,使用packer.io
并且我担心我可能会遗漏某些内容......
所以,在包装工中,我可以添加:
builders
,name
,name
部分使用构建器only
,最后packer build -only=<builder_name>
以有效地将我的构建限制为仅与特定构建器组合的配置器。 这一切都很好。
我现在要做的是使用相同的基本图像来创建3个不同的构建(以及产生的AMI)。显然,我可以复制粘贴相同的构建器配置3次,然后使用3个不同的配置器,使用only
参数将每个配置器链接到相应的构建器。
这感觉完全浪费和非常容易出错虽然......听起来我应该能够使用相同的构建器并且只限制应用哪些配置器。 ?
我唯一的解决方案是使用3个复制粘贴的构建器吗?有没有更好的解决方案?
答案 0 :(得分:2)
我有同样的问题,我想建立2个不同的AMI(一个用于升级,一个用于生产),它们之间的唯一区别是在配置期间应用的ansible组。建立@Rickard ov Essen的答案我使用jq编写了一个bash脚本来复制配置的构建器部分。
这是我的packer.json
文件:
{
"builders": [
{
"type": "amazon-ebs",
"name": "staging",
"region": "ap-southeast-2",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "t2.nano",
"ssh_username": "ubuntu",
"force_deregister": true,
"force_delete_snapshot": true,
"ami_name": "my-ami-{{ build_name }}"
}
],
"provisioners": [
{
"type": "ansible",
"playbook_file": "provisioning/site.yml",
"groups": ["{{ build_name }}"]
}
]
}
ansible供应商使用变量build_name
来选择要运行的ansible组。
然后我有一个运行打包器构建的bash脚本build.sh
:
#!/bin/bash
jq '.builders += [.builders[0] | .name = "production"]' packer.json > packer_temp.json
packer build packer_temp.json
rm packer_temp.json
您可以在this jqplay上查看packer_temp.json
文件的内容。
如果您需要添加更多AMI,您可以继续添加更多jq过滤器:
jq '.builders += [.builders[0] | .name = "production"] | .builders += [.builders[0] | .name = "test"]
这将为test
添加另一个AMI。
答案 1 :(得分:1)
only
适用于构建器name
上的过滤器,因此这不是一个选项。
您可以使用以下任何一个程序解决此问题:
预处理json并从一个创建3个模板。
使用带有用户变量的模板来定义它的构建并构建3次。在脚本中使用变量条件来运行正确的脚本。
使用模板的公共部分构建基础AMI,然后在配置差异的基础上运行3个不同的构建。
总的来说,Packer尝试通过不包括用于描述范围减少的不同构建风格的高级DSL来很好地解决一件事。对于更高级的用例,预处理和创建json很容易。