動機
AWSのEC2インスタンスにAnsibleを流すとき、Tagの設計を真面目にやっていないがあるタグに基づいてAnsibleのhostsを設定したい場合があります。
正しく設計できている場合は、Ansibleが提供しているec2.pyを使うと良いでしょう。
しかし、一部サーバのIPアドレスが取得できればいい場合は簡易的に実装したくなります。
方法
ansible.cfg
でinventory = inventory
と指定し、inventoryディレクトリに実行可能ファイルを置くことで、プログラムによるDynamic Inventoryを利用可能です。
このプログラムは何でもいいのでawscliを使ったシェルスクリプトで簡易的にAWSのタグから取得したサーバのPrivate IP一覧を渡すことができます。
出力は定められたJSONフォーマットなので、echoで無理やり整形します。
# !/bin/bash
echo '{"webserver": {"hosts":'
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=webserver*" \
--query "Reservations[*].Instances[*].PrivateIpAddress | [0]" \
--output json
echo '}}'
$ ./inventory/webserver
{"webserver": {"hosts":
[
"172.31.26.164",
"172.31.16.156",
"172.31.19.1",
"172.31.23.191"
]
}}
見た目は悪いですが、処理するのはAnsibleです。最低限実装できたことを喜びましょう。
AWSコマンドの解説
# aws ec2 describe-instances \
--filters "Name=tag:Name,Values=webserver*" \
--query "Reservations[*].Instances[*].PrivateIpAddress | [0]" \
--output json
このコマンドにより、tag:Name
でNameタグ、Values
でwebserver*
とワイルドカードを指定できます。
これは、webserver1,webserver2,webserver3,webserver4
のようなサーバを想定しています。適宜設定しましょう。
結果はPrivateIPさえわかればいいので--query
で絞ります。jq
コマンドでも可です。