Я развертываю что-то с Ansible на хосте Linux, и мне нужно, чтобы он слушал только второй сетевой адаптер на хосте.
Глядя на доступные факты, я вижу, что в ansible_interfaces перечислены все мои сетевые адаптеры, например
"ansible_interfaces": [
"lo",
"ens9f0",
"ens9f1"
]
Я знаю, что это не так, поэтому могу сбрасывать со счетов это. И, посмотрев на ansible_default_ipv4.alias, я вижу, что мой основной - ens9f0.
В пьесе / сборнике сценариев, как я могу определить, что ens9f1 является второстепенным?
Вариант использования в том, что я хочу сделать в шаблоне что-то вроде следующего:
Listen {{ ansible_second_nic.ipv4.address }}
Каждая машина, на которой я работаю, может иметь разные имена сетевых адаптеров, поэтому я не могу жестко запрограммировать их в своих ролях. Исторически я бы просто предположил, что eth1, но это уже небезопасно.
Взять ansible_interfaces
, вычесть 'lo'
и ansible_default_ipv4.alias
, возьмите первый элемент оставшегося списка:
- debug:
msg: "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | first }}"
Я заметил, что сетевые карты в "ansible_interfaces" не всегда возвращаются по порядку (я имею дело с 3, и мне нужно знать, какая из них вторая). Так что вам, возможно, придется сначала пропустить его через sort:
- debug:
msg: "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | sort | first }}"
Я пробовал использовать «facter_interfaces» вместо «ansible_interfaces», потому что он возвращает сетевые адаптеры по порядку, но я, похоже, не могу управлять этим выводом ... возможно, потому что это строка вместо списка? Я слишком новичок, чтобы знать.