私のローカルハードウェアには、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"