如何使用 Ansible 将第二个 IP 添加到 /etc/hosts 文件?

如何使用 Ansible 将第二个 IP 添加到 /etc/hosts 文件?

我有一个具有 2 个网络接口的虚拟机,eth0 和 ens10。

所以目前我用的是这个:

- name: Add IP address of all hosts to all hosts
  lineinfile:
    dest: /etc/hosts
    regexp: '.*{{ item }}$'
    line: "{{ hostvars[item].ansible_host }} {{item}}"
    state: present
  when: hostvars[item].ansible_host is defined
  with_items: "{{ groups.all }}"

但这只会添加 Ansible 文件中指定的主机的 IP(这是 eth0 interafce)。

我想将ens10接口IP添加到hosts文件中。

答案1

我想将ens10接口IP添加到hosts文件中。

ens10您可以使用变量获取接口的地址ansible_ens10.ipv4.address(假设您已启用事实收集)。但是,对于您正在做的事情,使用可能更有意义ansible_all_ipv4_addresses,这将允许您执行如下操作:

# Ensure we collect facts from all hosts
- hosts: all

# Generate entries in /etc/hosts file
- hosts: all
  gather_facts: false
  tasks:
    - blockinfile:
        path: /etc/hosts
        marker: "{mark} {{ item }}"
        block: |
          {% for addr in hostvars[item].ansible_all_ipv4_addresses %}
          {{ addr }} {{ item }}
          {% endfor %}
      loop: "{{ groups.all }}"

这可能会让你输入/etc/hosts类似以下内容的条目:

# BEGIN hostA
192.168.1.1 hostA
100.64.0.1 hostA
# END hostA
# BEGIN hostB
192.168.1.2 hostA
# END hostB

(假设主机 A 有两个地址,192.168.1.1100.64.0.1,而主机 B 有一个地址,192.168.1.2。)

如果您不想ansible_all_ipv4_addresses,您可以将循环限制到特定的接口名称:

- hosts: all

- hosts: all
  gather_facts: false
  tasks:
    - blockinfile:
        path: /etc/hosts
        marker: "{mark} {{ item }}"
        block: |
          {% for iface in ['ens9', 'ens10'] if iface in hostvars[item].ansible_interfaces %}
          {{ hostvars[item]['ansible_%s' % iface].ipv4.address }} {{ item }} {{ item }}-{{iface}}
          {% endfor %}
      loop: "{{ groups.all }}"

相关内容