概要
AWSのAMIをPackerから作ります。基本的にAnsibleで使用するパッケージをインストールします。
簡単のためNginxだけインストールしたAMIを作ります。
Packerのインストールは「Packer で Virtualbox 用の VagrantBox を作成する」を参考にしてください。
環境
- Ubuntu 14.04
- Packer 0.7.5
フォルダ構成
├── builders
│ ├── nginx.json
│ └── variables.json
├── provisioners
│ ├── inventory
│ │ └── aws
│ ├── nginx.yml
│ └── roles
│ └── nginx
│ └── tasks
│ └── main.yml
└── scripts
└── ansible.sh
簡単に説明すると以下です。
| フォルダ名 | 役割 |
|---|---|
| builders | packer用スクリプト |
| provisioners | ansibleのplaybook |
| scripts | build時に実行したいシェルスクリプト |
Scripts
Ubuntuにansibleをインストールするやつです。
# Add ansible repository sudo apt-add-repository -y ppa:ansible/ansible # Install ansible sudo apt-get update sudo apt-get -y install software-properties-common sudo apt-get -y install ansible
Ansible Playbookの用意
inventory/aws
inventoryです。ansible-localなのでlocalhostと指定します。
[nginx] localhost
nginx.yml
playbookです。
--- - name: Nginx hosts: nginx sudo: yes roles: - nginx
roles/nginx/tasks/main.yml
roleです。簡単のためインストールするだけです。
--- - name: Install Nginx apt: name=nginx state=latest update_cache=yes - name: Register Nginx as a service service: name=nginx state=started enabled=yes
Builderの用意
gitで管理することを考えてアクセスキーは分けることにします。
variables.jsonの方はバージョン管理に入れない感じです。
variables.json
自分のAWSアカウントのアクセスキー、シークレットキーを記述してください。
{
"aws_access_key": "xxxxxxxxxxxxxxxxxxxxx",
"aws_secret_key": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
nginx.json
access_key, secret_keyではUser variablesを利用します。
variablesセクションで定義し、{{user `変数名`}}で参照します。
source_amiはGUI上から無料のUbuntuを選んでます。
{
"variables": {
"aws_access_key": "",
"aws_secret_key": ""
},
"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "ap-northeast-1",
"source_ami": "ami-936d9d93",
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "nginx_{{timestamp}}"
}],
"provisioners": [{
"type": "shell",
"scripts": [
"../scripts/ansible.sh"
]
}, {
"type": "ansible-local",
"playbook_file": "../provisioners/nginx.yml",
"inventory_file": "../provisioners/inventory/aws",
"role_paths": [
"../provisioners/roles/nginx",
]
}]
}
実行と確認
$ packer build -var-file=variables.json nginx.json
実行中はPackerBuilder用のインスタンスができてます。

完了すると左メニューのAMIに登録されます。

以上です。お疲れ様でした。
その他
amazon-ebs: Error querying AMI: Request has expired.
が出た場合は実行マシンの時刻がおかしいと思うので、ntpを入れて正確にしておいてから実行してください。