我知道我可以使用变量将一些可更改的值放入文件的某个位置。但是我很想减少模板中的所有复制粘贴。
我可以使用
jq
之类的包装外壳脚本来完成此操作。但是我添加的每种复杂性都给其他人学习了其他东西。尽我所能尝试,我似乎找不到用Packer做到这一点的“祝福”惯用方式。 br /> #1 楼
Packer做出了一个积极的决定,即不内置此类功能。通过其他工具(例如jq等)可以更好地解决此问题。我们认为,利用Packer的最佳方法是在需要更多方法来创建模板时对其进行包装。用任何一种编程语言创建json都很容易,这在创建模板时为您提供了无限的表达能力。操纵模板的一种好方法是在jinja2中定义它们,并使用Python对其进行预处理。
#2 楼
到目前为止,我已经定义了我们使用的默认builders
和provisioners
,并在需要的地方插入了用户变量,例如: "type": "amazon-ebs",
"instance_type": "t2.micro",
"ami_name": "{{ user `ami-name` }}
例如。
packer-builders.json
和packer-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
,要考虑的更多!因此,如果有更好的方法,我真的很想在这里提供其他答案。