Ansible 2.12を使用して、ホスト:ラベルクラスを介してAWS EC2にアクセスします。

Ansible 2.12を使用して、ホスト:ラベルクラスを介してAWS EC2にアクセスします。

私のローカルハードウェアには、Ansible 2.12.2を使用してUbuntu 20を実行するVagrantボックスがあります。

AWS にアクセスでき、VPN で EC2 インスタンスも作成できました。

インベントリを見ると、EC2 サーバーは次のように表示されます。

"ec2-64-135-69-12.us-west-1.compute.amazonaws.com": {
    ...,
    "tags": {
        "Details": "File server and api",
        "Name": "File server via Ansible",
        "OS": "Ubuntu20",
        "Type": "Image Server",
        "class": "classfileserver2022"
    },
    ...
},

次のプレイブックでは、以下を介してサーバーにアクセスできます。

hosts: "ec2-64-135-69-12.us-west-1.compute.amazonaws.com"

しかし、私は上記のjsonのタグを介してアクセスしたいと思います。

頑張りました

hosts: "tags_class_classfileserver2022"

そして

hosts:
  - tags:Class="classfileserver2022"

ただし、次のエラーが発生します。

[WARNING]: Could not match supplied host pattern, ignoring: tags_class_classfileserver2022
skipping: no hosts matched

カテゴリタグを使用してEC2ホストにアクセスするには? (または他のタグ..)

私のスクリプトは次のとおりです。

---
  - name: "Prepare base of {{ server_name }} box"
    vars_files:
      - vars/0000_vars.yml
      - vars/vars_for_base_provision.yml
      - vars/vars_for_geerling.security.yml
#    hosts: "ec2-54-153-39-10.us-west-1.compute.amazonaws.com"   <-- this works
    hosts: "tags_Class_{{ tag_class }}"
    remote_user: ubuntu
    become: yes
    gather_facts: no

    pre_tasks:
    - name: Check for single host
      fail: msg="Single host check failed.  Try --limit or change `hosts` above."
      when: "{{ ansible_play_batch|length }} != 1"

    roles:
      - { role: geerlingguy.security }

答え1

「インベントリプラグイン」セクションをお読みください。信頼できる文書

YAML構成ソースでマニフェストプラグインの使用を開始するには、関連プラグイン用に文書化された許容可能なファイル名スキーマを含むファイルを作成し、プラグイン:プラグイン名を追加します。プラグインがコレクションにある場合は、完全修飾名を使用してください。

# demo.aws_ec2.yml
plugin: amazon.aws.aws_ec2

[...]設定されたkeyed_groupsオプションと一緒にホスト変数を使用して動的グループを作成できます。オプショングループを使用してグループを作成および結合して、ホスト変数を作成および変更することもできます。以下は、設定機能を利用するaws_ec2の例です。

# demo.aws_ec2.yml
plugin: amazon.aws.aws_ec2
regions:
  - us-east-1
  - us-east-2
keyed_groups:
  # add hosts to tag_Name_value groups for each aws_ec2 host's tags.Name variable
  - key: tags.Name
    prefix: tag_Name_
    separator: ""
groups:
  # add hosts to the group development if any of the dictionary's keys or values is the word 'devel'
  development: "'devel' in (tags|list)"
compose:
  # set the ansible_host variable to connect with the private IP address without changing the hostname
  ansible_host: private_ip_address

[...] をansible-doc -t inventory -l使用して利用可能なプラグインのリストを表示できます。ansible-doc -t inventory <plugin name>プラグイン固有のドキュメントと例を表示するには

答え2

Pankiの答えに基づいて、これは問題を解決しました。

# demo.aws_ec2.yml
inventory-plugins
plugin: amazon.aws.aws_ec2
regions:
  - us-west-1
keyed_groups:
  - key: tags.class    # <-- note: lowercase c
    prefix: tags_Class_
    separator: ""

プレイブックマッチタグの例:class:Uniqueclassname

# example_playbook.yml
---
  - name: "Playbook for {{ server_name }} EC2 instance"
    vars_files:
      - vars/0000_vars.yml
    hosts: "tags_Class_{{ tag_class }}"
    remote_user: ubuntu
    become: yes
    gather_facts: no

    roles:
      - { role: xxxxxxx }

プレイブックで生成された変数:

# vars/0000_vars.yml
tag_class: "uniqueclassname"
server_name: "My Fancy Server"

関連情報