Amazon-Ec2

從 Ansible 設置動態清單主機名

  • April 28, 2019

我正在為動手教程會話設置一組多達 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 台伺服器)。理想情況下,我想一次將名稱列表讀入一個數組,然後使用伺服器循環中的索引來選擇名稱(即,第三台伺服器將獲得第三個名稱)。我如何在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循環來完成同樣的事情。

引用自:https://serverfault.com/questions/961845