2015年6月17日水曜日

AnsibleでPacker用のVPCを作ってから"Amazon Linux"ベースのAMIを作成する


下記のスクリプト群で実現してみました。

$ tree ./
./
├── ansible
│   └── packer
│       └── ansible-amazonlinux.yml
├── cloudformation
│   └── packer.json
├── create-ami.sh
└── packer
    └── ansible-amazonlinux.json

次のように実行することで、VPCが作成されたあとにPackerが、そのVPC内にEC2作って、
いろいろとインストールした後、EC2からAMIを作成してくれます。

 ./create-ami.sh

create-ami.sh


必要な変数を設定して、AnsibleのPlaybookを実行しています。

リージョンの指定(自分がいるリージョンを取得)は
"AWS CLI"で最新の"Amazon Linux AMI"(gp2)のIDを取得する
で紹介したものを使っています。

ansible-amazonlinux.yml


最初にCloudFormationでVPCを作っています。
理由としては、僕が扱ってるアカウントがEC2-Classicが使えたり使えなかったり、
デフォルトVPCがあったり無かったり、だったので、
どこでも同じように利用できるためにPacker用のVPCを、まず作ることにしました。

最初は"AWS CLI"で作ってたんですが、CloudFromationが作成し終わってから、
次の処理を実施する場合、別途CloudFormationの状態チェックを行う処理(ループ)を
作り込む必要があり、それが面倒だったのでAnsibleの利用に切替ました。

上記のPlaybookは、CloudFormationの構築が完了した後に、次のタスクが実行されるので、
状態チェックのループを作り込む必要はありません。
また既にCloudFormationのStackがある場合、テンプレートの修正があった場合は
勝手にUpdateになり、ない場合はスキップもしてくれるので、その辺も楽でした。
(これが噂の冪等性ってやつですね!)

そして、下記で紹介した方法で最新の"Amazon Linux AMI"(gp2)のIDを取得して、
"AWS CLI"で最新の"Amazon Linux AMI"(gp2)のIDを取得する
最後に、VPCやらAMIやらの情報をパラメータとしてPackerに渡してAMIを作成しています。

packer.json


こんな感じのVPCを作ってます。
Packerは、このパブリックサブネットの中にEC2を起動します。


ansible-amazonlinux.json


パラメータで渡ってきたVPCやAMIの情報を使ってAMIを作成しています。
"Shell Provisioner"で"Ansible (Local) Provisioner"が利用できる環境を作ってます。


無事、実行されると、下記のようにAMIが作成されてます。

0 コメント: