Ubuntu – Extract a single item from a list using regex in Ansible

ansibleUbuntu

I'm attempting to configure a bridge interface on Ubuntu 16.04, templating the /etc/network/interfaces file in order to automatically insert the local NIC, like so:

auto br0
iface br0 inet dhcp
    bridge_ports <interface>

I do not have biosdevname installed, so the interface is showing as ens33 (on my test system), and changes on other hosts; instead of the historic eth0.

I can't use {{ ansible_default_ipv4.interface }} to complete the file, as this will only populate the file correctly on first run – after a reboot, running the playbook completes the file with the bridge br0 port instead.

I've tried a number of different iterations of using the {{ ansible_interfaces }} variable and attempted to match based on the regex en.* (all of these ports will be fixed Ethernet network cards) but none of them correctly populate the file.

The nearest I have come so far is:

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

which outputs

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

But I need to be able extract the actual adapter name that matches, not just whether there was a match or not.

Alternatively,

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

gives this promising output, but for all adapters, not just the one I'm attempting to match:

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"
}

Best Answer

Hmm, if you need to get interface name, try:

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