出力を入力へ

プログラミングに関する自分が考えた事を中心にまとめます

ansibleのEC2 dynamic inventoryで異なるタグがまとめられる不具合

Ansibleの AWS EC2 dynamic inventoryにおけるタグ管理はあまり賢くないなと思ったのでそのまとめ。 タグで変なことやるとどこかでバグらせそう。

ちなみに、ansibleはバージョン体系等を大きく変更しようとしているので ansibleのバージョンによって挙動が大きく変化しうる。 ここでは安定板のansible 2.9を対応とする。

AWS EC2 dynamic inventory

ansibleで対象のホストを動的に変化させたい場合は dynamic inventoryを利用する。 AWS EC2用としても専用のスクリプトが提供されており、 これを利用することで稼働中のインスタンス一覧を動的に取得することができる。

docs.ansible.com

動的に取得したインスタンスから対象となるホストをフィルタリングするため、 さまざまな属性ごとにインスタンスを取得することができる。 今回注目するのはタグによる抽出方法で、 これはタグのキー/バリューを指定して一致するインスタンス一覧を取得する方法である。

例えば、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-serverName=web_server も等しく tag_Name_web_server に変換される。 もっと言うと、 Name-web=serverというタグであっても tag_Name_web_server に変換される。

AWSは起動テンプレートやオートスケール、またはECSやEKSなどのサービスを通してEC2インスタンスを起動する場合に その情報をタグとして埋め込んでくれるが、 このときの情報はコロンで区切られている。 例えば aws:ec2launchtemplate:id = lt-xxxxxaws:autoscaling:groupName = xxxx といった感じである。 このコロンもアンダースコアに変換される。

AWSが付与するタグの中にansibleが混同するような情報は現在のところなさそう。 ただし、自分たちで独自にタグを付けるときに中途半端にAWSの付与するタグと似たようなものを利用すると、 どこかで不具合になる可能性がある。 あまり複雑なタグを付与しないように注意する必要がある。