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.
Take
ansible_interfaces
, subtract'lo'
andansible_default_ipv4.alias
, take first element of remaining list:I noticed the NICs in "ansible_interfaces" don't always come back in order (I'm dealing with 3 and I need to know which is 2nd). So you may have to pipe it through 'sort' first:
I tried using "facter_interfaces" instead of "ansible_interfaces" because it returns the NICs in order but I don't seem to be able to manipulate that output...perhaps because it's a string instead of a list? I'm too new to ansible to know.