Ansibleを利用した構成管理では、実行対象のホストをインベントリファイルと呼ばれるファイルに記載しておく必要があります。
以下のようなかんじ
[local] localhosts [test_server] 192.140.1.1 192.140.1.2 [web_server] 192.140.2.1
これだと、AWSでAutoScalingを利用した際や、新たにインスタンスをたてたときなどにこのインベントリファイルをメンテナンスし続けなければならなくなり、非常に面倒です。
これを解決するために、Ansible公式でEC2 External Inventoryというスクリプトが提供されています。
以下のec2.pyとec2.iniがそのEC2 External Inventoryで利用するスクリプトと設定ファイルです。
実際に動かしてためしてみる
実際にEC2 External InventoryをEC2インスタンス上からためしてみます。
事前準備
ファイルのダウンロード
まず、Ansibleサーバ上にec2.pyとec2.iniをダウンロードします。
$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
アクセス権限の設定
つづいて、AnsibleがAWSの環境を見に行くことができるようにAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを環境変数に設定します。
$ export AWS_ACCESS_KEY_ID='AKIA1234567890' $ export AWS_SECRET_ACCESS_KEY='secretkey1234567890'
AnsibleサーバもAWSで動いていて、インスタンスに適切にロールが適用されている場合はこの作業は必要ありません。
以上で事前準備は完了です!
ためしにec2.pyを動かしてみる
ec2.pyを単体で動かすと、以下のような情報がかえってきました。
$ ./ec2.py
{
"_meta": {
"ap-northeast-1a": [
"172.140.1.1",
"172.140.1.2"
],
"tag_Name_kabegiwa_ansible_server": [
"172.140.1.1"
],
"tag_Name_kabegiwa_ansible_client": [
"172.140.1.2"
],
"type_t2_micro": [
"172.140.1.2"
],
"type_t2_large": [
"172.140.1.2"
],
"vpc_id_vpc_12345678": [
"172.140.1.1",
"172.140.1.2"
]
AZやリージョン、タグ名などでまとまった情報がJSON形式で応答されていることがわかります。
このひとつひとつがAnsibleでいうグループになります。
Ansibleコマンドを実行する
実際にAnsibleを実行してみます。
Ansibleの-iオプションでec2.pyをわたしてあげるだけです。
たとえば、Nameタグがkabegiwa_ansible_clientのものにpingを実行してみます。
$ ansible -i ec2.py tag_Name_kabegiwa_ansible_client -u ec2-user --private-key='./himitsukagi.pem' -m ping
172.140.1.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
無事実行できました!
おわりに
このようにEC2 External Inventoryをつかうことで動的にAnsibleのインベントリファイルを作成することができます。
インフラのコード化と自動化がはかどりますね!!!

- 作者: 若山史郎
- 発売日: 2014/07/30
- メディア: Kindle版
- この商品を含むブログ (2件) を見る