この記事は、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
で終わる必要があります。