🚀
ansible 2.10でのAWS動的インベントリーの利用方法
はじめに
久しぶりにansibleを触って、EC2の一覧を動的インベントリーにて利用しようとしたところ、以下のec2.py
が利用できなくなっていた。
$ ./hosts/ec2.py --list
Traceback (most recent call last):
File "./hosts/ec2.py", line 172, in <module>
from ansible.module_utils import ec2 as ec2_utils
ImportError: cannot import name ec2
ansible 2.10
にて動的インベントリーを利用する方法を調査したのでメモ
環境
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)
$ python -V
Python 3.7.9
$ ansible --version
ansible 2.10.9
手順
これを使えばいい。
インストール
$ ansible-galaxy collection install amazon.aws
設定ファイル
aws_ec2.yml
plugin: aws_ec2
regions:
- ap-northeast-1
filters:
instance-state-name : running
$ ansible-inventory -i hosts/aws_ec2.yml --list
## 稼働中のインスタンス情報がずらっと出力して最後にansible実行時にホストとして
## 指定できる情報が出力されてる
"all": {
"children": [
"aws_ec2",
"ungrouped"
]
},
"aws_ec2": {
"hosts": [
"ip-10-1-1-186.ap-northeast-1.compute.internal",
"ip-10-1-1-188.ap-northeast-1.compute.internal",
"ip-10-1-1-229.ap-northeast-1.compute.internal",
"ip-10-1-1-230.ap-northeast-1.compute.internal",
"ip-10-1-1-245.ap-northeast-1.compute.internal",
"ip-10-1-1-247.ap-northeast-1.compute.internal"
]
}
上の状態だと、インスタンスの分類毎で一括処理とかできないので、keyed_groups
を追加する
aws_ec2.yml
plugin: aws_ec2
regions:
- ap-northeast-1
filters:
instance-state-name : running
keyed_groups:
- prefix: name
key: tags['Name']
- prefix: service
key: tags['Service']
$ ansible-inventory -i hosts/aws_ec2.yml --list
## NameタグのグループとServiceタグのグループ情報が追加される
"name_stg_bastion": {
"hosts": [
"ip-10-1-1-229.ap-northeast-1.compute.internal"
]
},
"name_stg_manager01": {
"hosts": [
"ip-10-1-1-188.ap-northeast-1.compute.internal"
]
},
"name_stg_manager02": {
"hosts": [
"ip-10-1-1-186.ap-northeast-1.compute.internal"
]
},
"service_manager": {
"hosts": [
"ip-10-1-1-186.ap-northeast-1.compute.internal",
"ip-10-1-1-188.ap-northeast-1.compute.internal"
]
}
}
グループを指定することで特定のタグのホストに対してansibleを実行できた
$ ansible service_manager -i hosts/aws_ec2.yml -m ping -u ec2-user
ip-10-1-1-188.ap-northeast-1.compute.internal | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ip-10-1-1-186.ap-northeast-1.compute.internal | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Discussion