在 Ansible 中使用正则表达式从列表中提取单个项目

在 Ansible 中使用正则表达式从列表中提取单个项目

我正在尝试在 Ubuntu 16.04 上配置桥接接口,模板化/etc/network/interfaces file以便自动插入本地 NIC,如下所示:

auto br0
iface br0 inet dhcp
    bridge_ports <interface>

我没有biosdevname安装,所以界面显示为ens33(在我的测试系统上),并在其他主机上发生变化;而不是历史的eth0

我无法使用{{ ansible_default_ipv4.interface }}它来完成文件,因为这只会在第一次运行时正确填充文件 - 重新启动后,运行剧本会使用桥接br0端口完成文件。

我尝试了多次使用该{{ ansible_interfaces }}变量,并尝试根据正则表达式 en.* 进行匹配(所有这些端口都将是固定的以太网网卡),但它们都无法正确填充文件。

我目前最接近的一次是:

- debug: msg={{ ansible_interfaces | map('match','ens.*') | list }}

输出

TASK [openvpn : debug] ****************************************************
ok: [192.168.0.134] => {
    "msg": [
        false,
        false,
        true
    ]
}

但我需要能够提取匹配的实际适配器名称,而不仅仅是是否匹配。

或者,

- debug: msg="{{ item }}"
  when: "{{ item }} | map('match','ens.*')"
  with_items: "{{ ansible_interfaces }}"

给出了这个有希望的输出,但对于所有适配器,而不仅仅是我尝试匹配的适配器:

TASK [openvpn : debug] *****************************************************
ok: [192.168.0.134] => (item=lo) => {
    "item": "lo",
    "msg": "lo"
}
ok: [192.168.0.134] => (item=br0) => {
    "item": "br0",
    "msg": "br0"
}
ok: [192.168.0.134] => (item=ens33) => {
    "item": "ens33",
    "msg": "ens33"
}

答案1

嗯,如果您需要获取接口名称,请尝试:

- debug:
    msg: "{{ ansible_interfaces | select('match','ens.*') | list | first }}"

相关内容