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