我正在创建大约10-12个Packer模板,这些模板几乎都以相同的方式工作。相同的构建器(Amazon EBS),AMI名称略有不同,并且几乎相同的预配器(Ansible Remote)-有时具有其他变量,有时具有多个剧本。一样。

我知道我可以使用变量将一些可更改的值放入文件的某个位置。但是我很想减少模板中的所有复制粘贴。

我可以使用jq之类的包装外壳脚本来完成此操作。但是我添加的每种复杂性都给其他人学习了其他东西。尽我所能尝试,我似乎找不到用Packer做到这一点的“祝福”惯用方式。 br />

#1 楼

Packer做出了一个积极的决定,即不内置此类功能。通过其他工具(例如jq等)可以更好地解决此问题。我们认为,利用Packer的最佳方法是在需要更多方法来创建模板时对其进行包装。

用任何一种编程语言创建json都很容易,这在创建模板时为您提供了无限的表达能力。操纵模板的一种好方法是在jinja2中定义它们,并使用Python对其进行预处理。

#2 楼

到目前为止,我已经定义了我们使用的默认buildersprovisioners,并在需要的地方插入了用户变量,例如:

 "type": "amazon-ebs",
 "instance_type": "t2.micro",
 "ami_name": "{{ user `ami-name` }} 

例如。 packer-builders.jsonpacker-provisioners.json,然后将所有单独的Packer模板放在自己的目录中。

然后我编写了一个快速的Bash脚本,该脚本采用了一个要构建的模板的名称,找到了所有packer-*.json文件,并使用jq --slurp将其合并(例如jq --slurp '.[0] * .[1] * .[2]' $LIST_OF_FILES),最后将其与提供的模板合并。它保存输出并将其发送到packer build。作为奖励,我还使用了jsmin,然后再点击jq,这样我就可以在任何JSON文件中包含注释了。

效果很好,但我不是它的忠实拥护者,因为它是自定义的,它为其他遇到它的人增加了进入的障碍(不仅仅是packer build something.json,要考虑的更多!

因此,如果有更好的方法,我真的很想在这里提供其他答案。