web-dev-qa-db-ja.com

Ansibleからの動的インベントリホスト名の設定

ハンズオンチュートリアルセッション用に、最大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でそれを行うことができますか?それとももっと良いアプローチがありますか?

1
Synchro

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ループを使用して同じことを実行します。

2
larsks

別のアプローチは、ループインデックスを使用して複数のリストをループすることです。このようにして、リストにオフセットを追加するのが簡単になります。

- 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
0
Kanwar Saad