4

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.

Anonymouslemming
  • 891
  • 4
  • 15
  • 26
  • You need to define what you mean by "second nic". With [predictable network interface names](https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/) you need to know about the machine's buses/nic ahead of time to predict the correct name. You could probably check some expected interface names. e.g. Your example should already have `ansible_ens9f1.ipv4[0].address` available. – jscott May 06 '17 at 00:35
  • All of our nodes will have 2 NICs. We don't know in advance what the name of the second NIC will be because it's different hardware each time. This means that hardcoding NICs is not safe because these will change for different target nodes. Hence the need for something in ansible (filter / module / etc.) to iterate over the list of ansible_interfaces, remove ansible_default_ipv4.alias and lo, then get the remaining item. The second nic will be the one that is not ansible_default_ipv4.alias or lo. – Anonymouslemming May 06 '17 at 03:44

2 Answers2

5

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 }}"
Konstantin Suvorov
  • 3,996
  • 1
  • 12
  • 13
0

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:

- debug:
msg: "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | 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.

Brad M
  • 1