概要
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を入れて正確にしておいてから実行してください。