てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] aws_ec2 インベントリープラグインのinclude_filtersのand/or条件の指定方法

はじめに

AWS上のEC2インスタンスの情報を動的にインベントリとして利用できる、amazon.aws.aws_ec2というインベントリープラグインがあります。

その中に、include_filtersというオプションがあり、Nameタグの情報などで抽出条件を指定できます。

include_filters ということで複数形なので条件も複数指定できるのですが、どう指定すると and なのか or なのか初見では分かりにくかったです。

自分で試してみた結果をまとめます。

  • 環境
    • ansible 5.4.0
    • ansible-core 2.12.3
    • amazon.aws コレクション 2.1.0

前提

EC2 インスタンスは、以下のものがある状態とします。

タグ Name タグ aws:cloudformation:stack-name
sv01a stack01
sv01b stack01
sv01c stack01
sv02a stack02
sv02b stack02
sv02c stack02

CloudFormation のスタック名 stack01stack02 で作成されたインスタンスが3つずつあるような状態です。

or 条件の include_filters

各条件をそれぞれリストで指定すると or 条件になりました。

---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
include_filters:
  - tag:Name:
      - sv0*a
  - tag:aws:cloudformation:stack-name:
      - stack01
hostnames:
  - tag:Name

確認します。

$ ansible-inventory -i inventory_aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--sv01a 
  |  |--sv01b
  |  |--sv01c
  |  |--sv02a
  |--@ungrouped:

Nameで sv0*a を指定しているので該当するインスタンスが2つ抽出されるのに加え、スタック名 stack01 を or 条件で指定しているため、stack01 で作成されたすべてのインスタンスも抽出されたという形です。

and 条件の include_filters

一つのリストの中に複数の条件を指定すると and になりました。

---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
include_filters:
  - tag:Name:
      - sv0*a
    tag:aws:cloudformation:stack-name:
      - stack01
hostnames:
  - tag:Name

or 条件のときとの見かけ上の違いは、tag:aws:cloudformation:stack-name の前の - がなくなっただけです。

確認します。

$ ansible-inventory -i inventory_aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--sv01a
  |--@ungrouped:

今度は、Nameで sv0*a に加えて、and 条件でスタック名 stack01 を指定しています。そのため スタック名 stack01 かつ、Name sv0*a に該当するインスタンスのみが抽出されました。

おわりに

ドキュメント見てもピンとこないときでも、一回試すと腑に落ちたというパターンでした。