ansible ansible_default_ipv4 设置错误接口

ansible ansible_default_ipv4 set wrong interface

我正在尝试配置主机并自动 select 相关界面。
为此,我正在尝试 运行 Ansible 任务:

- name: Set the list of interfaces to be configured
  network_interfaces_to_configure: "{{ ansible_interfaces | difference([ ansible_default_ipv4.alias, 'lo', 'docker0' ]) }}"

出于某种原因,它在 network_interfaces_to_configure 中存储了一个已停用的接口 — 将其设置为 enp1s0f1,应该设置为 enp1s0f0

主机有以下接口:

我还验证了默认网关设置为 enp1s0f0

您最终得到错误界面的原因是您在 difference 过滤器中排除了正确的界面。

difference([ ansible_default_ipv4.alias, 'lo', 'docker0' ]) 
##               ^--- it is excluded because of this addition 
##                    of `ansible_default_ipv4.alias` in the list

现在,正如您所说 enp1s0f1 应该被排除在外,因为它是一个非活动接口,那么您将不得不进一步挖掘这些接口的属性。

为此,您必须知道 ansible_interfaces 中的列表对应于 ansible_* 列出这些接口更多信息的事实。

例如,在您的情况下,您将拥有这些事实:

  • ansible_lo
  • ansible_docker0
  • ansible_enp1s0f0
  • ansible_enp1s0f1

信息如下:

ansible_lo:
  active: true
  device: lo
  ipv4:
    address: 127.0.0.1
    broadcast: ''
    netmask: 255.0.0.0
    network: 127.0.0.0
  mtu: 65536
  promisc: false
  type: loopback

因此,也许更好的主意是创建一个事实并根据它们的 activetype 属性排除接口。

类似于:

- set_fact:
    active_interfaces: "{{ active_interfaces | default([]) + [item] }}"
  loop: "{{ ansible_interfaces }}"
  when: 
    ## only include active interfaces
    - lookup('vars', 'ansible_' ~ item).active
    ## exclude local loopback interfaces (`lo`)
    - lookup('vars', 'ansible_' ~ item).type != 'loopback'
    ## exclude bridge interfaces (`dockerO`)
    - lookup('vars', 'ansible_' ~ item).type != 'bridge'

然后,在 network_interfaces_to_configure 中使用该变量:

- network_interfaces_to_configure: "{{ active_interfaces }}"

根据剧本,这是我自己的设置的示例:

- hosts: localhost
  gather_facts: yes

  tasks:
    - set_fact:
        active_interfaces: "{{ active_interfaces | default([]) + [item] }}"
      loop: "{{ ansible_interfaces }}"
      when: 
        - lookup('vars', 'ansible_' ~ item).active
        - lookup('vars', 'ansible_' ~ item).type != 'loopback'
        - lookup('vars', 'ansible_' ~ item).type != 'bridge'

    - debug:
        var: active_interfaces

这产生:

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [set_fact] ****************************************************************
ok: [localhost] => (item=eth0)
skipping: [localhost] => (item=tunl0) 
skipping: [localhost] => (item=docker0) 
skipping: [localhost] => (item=lo) 
ok: [localhost] => (item=services1)
skipping: [localhost] => (item=ip6tnl0) 

TASK [debug] *******************************************************************
ok: [localhost] => 
  active_interfaces:
  - eth0
  - services1