Назад | Перейти на главную страницу

Извлечь отдельный элемент из списка с помощью регулярного выражения в Ansible

Я пытаюсь настроить интерфейс моста в Ubuntu 16.04, используя шаблон /etc/network/interfaces file чтобы автоматически вставить локальную сетевую карту, например:

auto br0
iface br0 inet dhcp
    bridge_ports <interface>

у меня нет biosdevname установлен, поэтому интерфейс отображается как ens33 (в моей тестовой системе) и изменения на других хостах; вместо исторического eth0.

Я не могу использовать {{ ansible_default_ipv4.interface }} для завершения файла, так как это будет правильно заполнять файл только при первом запуске - после перезагрузки запуск playbook завершает файл с мостом br0 порт вместо этого.

Я пробовал несколько разных вариантов использования {{ ansible_interfaces }} переменная и попытка сопоставления на основе регулярного выражения en. * (все эти порты будут фиксированными сетевыми картами Ethernet), но ни один из них не заполняет файл правильно.

Ближайшее, что я зашел так далеко, это:

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

который выводит

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

Но мне нужно иметь возможность извлечь фактическое имя адаптера, которое совпадает, а не только то, было совпадение или нет.

В качестве альтернативы,

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

дает этот многообещающий результат, но для всех адаптеров, а не только для того, который я пытаюсь сопоставить:

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

Хм, если вам нужно получить имя интерфейса, попробуйте:

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