ハンズオンチュートリアルセッション用に、最大150台の一時EC2サーバーをセットアップしています。
EC2インベントリを動的に作成し、すべてを構成するために作成されたインスタンスに対してロールを実行していますが、それぞれに簡単なホスト名を設定する必要があります。そのために、ホスト名に使用する名前の簡単なリストを含むファイルがあります。これは私のプレイブックにあります:
---
- hosts: localhost
connection: local
gather_facts: false
tasks:
- name: Provision a set of instances
ec2:
key_name: ubuntu
instance_type: t2.micro
image: "{{ AMI_id }}"
wait: true
exact_count: {{ server_count }}
count_tag:
Name: Tutorial
instance_tags:
Name: Tutorial
groups: ['SSH', 'Web']
register: ec2
- name: Add all instance public IPs to Host group
add_Host: hostname={{ item.public_ip }} groups=ec2hosts
loop: "{{ ec2.instances }}"
- name: Set a Host name for each instance in DNS
route53:
zone: {{ tutorial_domain }}
record: "name.{{ tutorial_domain }}"
state: present
type: A
ttl: 120
value: {{ item.public_ip }}
wait: yes
loop: "{{ ec2.instances }}"
それは本当にそのrecord: "name.{{ tutorial_domain }}"
行に帰着します-名前のリストで名前を検索し、それをホスト名として使用して、name
を{{ some_dynamic_name }}
に変換するにはどうすればよいですか?
ルックアッププラグインを見たことがありますが、それらはすべて、外部ファイルのコンテンツ全体をループすることに焦点を当てているようです-しかし、私はすでにサーバーのリストをループしており、そのリストは名前のリストよりも短い可能性があります(例:サーバーは10台しかないかもしれません)。理想的には、名前のリストを一度配列に読み込んでから、サーバーループのインデックスを使用して名前を選択します(つまり、3番目のサーバーが3番目の名前を取得します)。どうすればansibleでそれを行うことができますか?それとももっと良いアプローチがありますか?
Zip
フィルタを使用して、次のようにインスタンスのリストを名前のリストと組み合わせることができます。
---
- hosts: localhost
gather_facts: false
vars:
tutorial_domain: example.com
ec2:
instances:
- public_ip: 1.2.3.4
- public_ip: 2.3.4.5
names:
- blue-duck
- red-panda
tasks:
- debug:
msg:
route53:
zone: "{{ tutorial_domain }}"
record: "{{ item.1 }}.{{tutorial_domain}}"
state: present
type: A
ttl: 120
value: "{{ item.0.public_ip }}"
wait: yes
loop: "{{ ec2.instances|Zip(names)|list }}"
古いバージョンのAnsibleでは、with_together
ループを使用して同じことを実行します。
別のアプローチは、ループインデックスを使用して複数のリストをループすることです。このようにして、リストにオフセットを追加するのが簡単になります。
- set_fact:
ips: ['1.2.3.4', '5.6.7.8']
hostnames: ['Host1', 'Host2']
- debug:
msg: "ip={{ ips[index] }}, hostname={{ hostnames[index] }}"
loop: "{{ ips }}"
loop_control:
index_var: index