Linux – How to find the name of the second NIC using ansible

ansibleautomationlinuxnetworking

I'm deploying something with Ansible to a Linux host, and I need it to listen only on the second NIC on the host.

Looking at the facts available, I can see ansible_interfaces lists all of my NICs, e.g.

 "ansible_interfaces": [
        "lo", 
        "ens9f0", 
        "ens9f1"
 ]

I know that it's not lo, so I can discount that. And by looking at ansible_default_ipv4.alias, I can see that my primary is ens9f0.

In a play / playbook, how could I then work out that ens9f1 is the secondary ?

The use case for this is that I want to do something like the following in a template:

Listen {{ ansible_second_nic.ipv4.address }}

Each machine I work on may have different NIC names, so I can't hard-code these in my roles. Historically I would just assume eth1, but that's no longer safe.

Best Answer

Take ansible_interfaces, subtract 'lo' and ansible_default_ipv4.alias, take first element of remaining list:

- debug:
    msg: "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | first }}"