てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] aws_ec2 インベントプラグインで CloudFormation のスタック名でグループ化やフィルターする

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

参考

tekunabe.hatenablog.jp