Posted at

AWSのタグで指定する簡易的なAnsible Dynamic Inventory


動機

AWSのEC2インスタンスにAnsibleを流すとき、Tagの設計を真面目にやっていないがあるタグに基づいてAnsibleのhostsを設定したい場合があります。

正しく設計できている場合は、Ansibleが提供しているec2.pyを使うと良いでしょう。

しかし、一部サーバのIPアドレスが取得できればいい場合は簡易的に実装したくなります。


方法

ansible.cfginventory = 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タグ、Valueswebserver*とワイルドカードを指定できます。

これは、webserver1,webserver2,webserver3,webserver4のようなサーバを想定しています。適宜設定しましょう。

結果はPrivateIPさえわかればいいので--queryで絞ります。jqコマンドでも可です。