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
主机有以下接口:
- lo
- docker0(虚拟)
- enp1s0f0(硬件连接并启用)
- enp1s0f1(硬件禁用且没有任何物理连接)
我还验证了默认网关设置为 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
因此,也许更好的主意是创建一个事实并根据它们的 active
和 type
属性排除接口。
类似于:
- 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
我正在尝试配置主机并自动 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
主机有以下接口:
- lo
- docker0(虚拟)
- enp1s0f0(硬件连接并启用)
- enp1s0f1(硬件禁用且没有任何物理连接)
我还验证了默认网关设置为 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
因此,也许更好的主意是创建一个事实并根据它们的 active
和 type
属性排除接口。
类似于:
- 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