この記事は、Ansible Advent Calendar 2022 (Adventar 版) の 24日目の記事です。
はじめに
Ansible には AWS の EC2 インスタンスの情報を取得し、動的なインベントリとして扱える amazon.aws.aws_ec2_inventory というインベントリプラグインがあります。
スタック名でグループ化やフィルターするのは、個人的にまぁまぁ使う割には指定の仕方を忘れるので、記事として書いておきます。
CloudFormation で作られたリソースには aws:cloudformation:stack-name タグの値に スタック名 が設定されます。これを利用してフィルターします。
スタック名でグループ化する
動的にグループを作れるkeyed_groups オプションを利用します。
--- plugin: amazon.aws.aws_ec2 regions: - ap-northeast-1 # この例では東京リージョン keyed_groups: - key: tags["aws:cloudformation:stack-name"] # ポイント hostnames: - tag:Name
ansible-inventory を使ってグループ関係を表示して確認します。
$ ansible-inventory -i inventory_aws_ec2.yml --graph @all: |--@_test_stack02: | |--User1_CSR1 | |--User1_CSR2 | |--User1_controller |--@_test_stack02: | |--User2_CSR1 | |--User2_CSR2 | |--User2_controller |--@aws_ec2: ...(略)...
スタック名 test-stack01、test-stack02 によってグループ化された結果が表示されました。スタック名に含まれる - は、グループの名前に使うときは _ に変換されます。
また、上記の結果のように keyed_groups で作ったグループ名は、デフォルトで _ が先頭に付加されます。これは、デフォルトの prefix である "" (空文字)と、デフォルトの separator である _ が結合した結果です。
もし、何も先頭に付加させたくない場合は、以下のように指定します(抜粋)。
keyed_groups: - key: tags["aws:cloudformation:stack-name"] separator: "" # 追加ポイント
スタック名でフィルターする
以下のサンプルでは、CloudFormation のスタック名 test-stack01 によって作られた EC2 インスタンスをフィルターする例です。
--- plugin: amazon.aws.aws_ec2 regions: - ap-northeast-1 # この例では東京リージョン include_filters: - tag:aws:cloudformation:stack-name: test-stack01 # ポイント hostnames: - tag:Name
"test*" や *stack* なども指定できます。
補足
ファイル名は、aws_ec2.yml か、aws_ec2.yaml で終わる必要があります。