mito’s blog

IT技術メインの雑記。思い立ったが吉日。

[Ansible] ダイナミックインベントリで起動中のインスタンスのIPアドレスを出力する

この記事は、Ansible Advent Calendar 2022 の9日目のエントリです。

はじめに

ダイナミックインベントリを使う時はデフォルトのDNS名をhostsに指定していたのですが、ほかの指定はできないのかと思い、IPアドレスを対象に実施してみました。


インベントリファイル

ファイル名は、仕様でaws_ec2.ymlか***aws_ec2.ymlとする必要があります。

$ cat aws_ec2.yml
---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
hostnames:
  # 結果をプライベートIPで出力する。パブリックIPは「ip-address」を指定する
  - private-ip-address
include_filters:
  # リストの中に複数の条件をいれると、andでつながる
  - instance-state-name: running
    tag:Name:
    # ワイルドカードが使える
    - "web_*"
compose:
  ansible_host: private_ip_address     # hostsにプライベートIPをしているので、今回は不要

$ 


実行ログ

インスタンスの状況は以下です。

Name インスタンスの状態 プライベートIPアドレス
web_01 実行中 172.31.36.***
web_02 実行中 172.31.32.***
web_03 停止済み 172.31.41.***
weeeeebb!!! 実行中 172.31.16.***


ansible-inventoryコマンドを実行し、確認します。

$ ansible-inventory -i aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--172.31.32.***
  |  |--172.31.36.***
  |--@ungrouped:
$ 


起動中のweb_01、web_02のプライベートIPアドレスのみ出力できました。


注意

プライベートIPアドレスインスタンスが停止していても割り当てられているので、aws_ec2.ymlのフィルターにあるinstance-state-name : runningが必要です。

aws_ec2.ymlからinstance-state-name : runningを削除した場合、以下のように停止中のインスタンスも表示されます。

$ cat aws_ec2.yml 
---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
hostnames:
  - private-ip-address
include_filters:
  - tag:Name:
    - "web_*"
$ 
$ ansible-inventory -i aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--172.31.32.***
  |  |--172.31.36.***
  |  |--172.31.41.***
  |--@ungrouped:
$ 


参考

フィルターの条件をandにする方法が分からなかったので助かりました!

フィルターなどの条件に指定できるEC2インスタンスのパラメータは以下のようです。