サーバのロールごとに playbook を作成して、本番用途と開発用途で playbook を分けて web-app.prd.yml と web-app.dev.yml のようにして作成するAMIの対象を変数で切り替えられるようにしている。
PackerのAnsibleでは role_paths に一つ一つロールを設定しないと role がアップロードされないが、provisioners で roles ディレクトリごとまるっとアップロードするように仕込んで、いちいち指定しなくても良いようにしている。
{
"variables": {
"role": "",
"env": "",
"volume_size": "8",
"ansible_staging_directory": "/tmp/packer-provisioner-ansible-local"
},
"builders": [{
"type": "amazon-ebs",
"access_key": "<your access_key>",
"secret_key": "<your secret_key>",
"region": "ap-northeast-1",
"source_ami": "ami-4985b048",
"instance_type": "c3.large",
"ssh_username": "ec2-user",
"ssh_timeout": "5m",
"ami_name": "{{user `role`}}-{{isotime \"20060102-150405 MST\"}}",
"user_data_file": "combined-userdata.txt",
"ami_block_device_mappings": [
{ "device_name": "/dev/xvda", "volume_type": "gp2", "volume_size": "{{user `volume_size`}}", "delete_on_termination": true },
{ "device_name": "/dev/sdb", "virtual_name": "ephemeral0" },
{ "device_name": "/dev/sdc", "virtual_name": "ephemeral1" }
],
"tags": {
"Name": "{{user `role`}}",
"Environment": "{{user `env`}}"
}
}],
"provisioners": [
{ "type": "shell", "script": "pre-process.sh" },
{
"type": "shell",
"inline": [
"mkdir -p {{ user `ansible_staging_directory` }}"
]
},
{
"type": "file",
"source": "roles",
"destination": "{{ user `ansible_staging_directory` }}"
},
{
"type": "ansible-local",
"playbook_file": "{{user `role`}}.{{user `env`}}.yml"
}
]
}
$ packer build -var 'role=web-app' -var 'env=prd' packer.json