Ansibleの AWS EC2 dynamic inventoryにおけるタグ管理はあまり賢くないなと思ったのでそのまとめ。 タグで変なことやるとどこかでバグらせそう。
ちなみに、ansibleはバージョン体系等を大きく変更しようとしているので ansibleのバージョンによって挙動が大きく変化しうる。 ここでは安定板のansible 2.9を対応とする。
AWS EC2 dynamic inventory
ansibleで対象のホストを動的に変化させたい場合は dynamic inventoryを利用する。 AWS EC2用としても専用のスクリプトが提供されており、 これを利用することで稼働中のインスタンス一覧を動的に取得することができる。
動的に取得したインスタンスから対象となるホストをフィルタリングするため、 さまざまな属性ごとにインスタンスを取得することができる。 今回注目するのはタグによる抽出方法で、 これはタグのキー/バリューを指定して一致するインスタンス一覧を取得する方法である。
例えば、ansible-playbookで タグ Env=production
が付与されたインスタンスを対象としてansibleを適用したい場合は
hostsの欄に指定すればよい。
- hosts: tag_Env_production remote_user: ec2-user roles: - { role: docker, tags: docker } ...
EC2 dynamic inventoryにおけるタグの扱い
ドキュメントにも、タグは tag_KEY_VALUE
の形に変換されるとドキュメントに記載されている。
例えば Name=webserver
というタグが付与されたインスタンスであれば
tag_Name_webserver
という形で整理される。
問題なのがKey/Valueに記号が含まれる場合で、
このとき対象の記号はアンダースコアに変換される。
すなわち Name=web-server
も Name=web_server
も等しく
tag_Name_web_server
に変換される。
もっと言うと、 Name-web=server
というタグであっても tag_Name_web_server
に変換される。
AWSは起動テンプレートやオートスケール、またはECSやEKSなどのサービスを通してEC2インスタンスを起動する場合に
その情報をタグとして埋め込んでくれるが、
このときの情報はコロンで区切られている。
例えば aws:ec2launchtemplate:id = lt-xxxxx
や aws:autoscaling:groupName = xxxx
といった感じである。
このコロンもアンダースコアに変換される。
AWSが付与するタグの中にansibleが混同するような情報は現在のところなさそう。 ただし、自分たちで独自にタグを付けるときに中途半端にAWSの付与するタグと似たようなものを利用すると、 どこかで不具合になる可能性がある。 あまり複雑なタグを付与しないように注意する必要がある。