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

Dou*_*oug 6 ubuntu ansible

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

auto br0
iface br0 inet dhcp
    bridge_ports <interface>
Run Code Online (Sandbox Code Playgroud)

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

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

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

到目前为止,我最近的距离是:

- debug: msg={{ ansible_interfaces | map('match','ens.*') | list }}
Run Code Online (Sandbox Code Playgroud)

哪个输出

TASK [openvpn : debug] ****************************************************
ok: [192.168.0.134] => {
    "msg": [
        false,
        false,
        true
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

或者,

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

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

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"
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*rov 11

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

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