我有同樣的問題,在這裏我想建立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
你可以看到什麼packer_temp.json
文件看起來像this jqplay。
如果您需要添加更多的AMI你可以繼續添加更多的JQ過濾器:
jq '.builders += [.builders[0] | .name = "production"] | .builders += [.builders[0] | .name = "test"]
這將再添AMI的test
。
實際上,'only'在構建'name'的時候默認設置爲'type'。但是你可以設置一個自定義名稱。 https://www.packer.io/docs/templates/provisioners.html#run-on-specific-builds –
是的,正確的。我已經更新了我的答案。感謝您指出了這一點。 –