🚀

ansible 2.10でのAWS動的インベントリーの利用方法

2021/05/13に公開

はじめに

久しぶりにansibleを触って、EC2の一覧を動的インベントリーにて利用しようとしたところ、以下のec2.pyが利用できなくなっていた。

https://docs.ansible.com/ansible/2.9_ja/user_guide/intro_dynamic_inventory.html#aws-ec2

$ ./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

手順

これを使えばいい。
https://docs.ansible.com/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html

インストール

$ 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