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

Как добавить резолверы через ansible в Ubuntu 16.04?

Я начинаю несколько обновлений Ubuntu 14.04 и попутно создаю несколько сценариев Ansible, которые позже будут использоваться на нескольких других хостах. Во-первых, настройка /etc/resolv.conf чтобы указать на локальные ресурсы DNS.

Старый метод обеспечения /etc/resolv.conf был сценарий оболочки с awk / sed / grep, который запускал ssh который редактировал файл напрямую. Кажется, что в 16.04 этого нет, который предупреждает об этом:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN.

Страница руководства для resolvconf упоминает добавление dns-nameservers в /etc/network/interfaces а также примечание, не рекомендующее использовать resolvconf чтобы добавить информацию о сервере имен вручную:

The administrator can run resolvconf from the command line...but this is not normally necessary or advisable.

Кажется, единственный вариант - отредактировать /etc/network/interfaces но как мне указать сетевой интерфейс в playbook? Это не стандарт eth0..1..2 но какая-то смесь алфавитного супа вроде enp6s0 или ens18 чего я не совсем понимаю. При другом обновлении я смог переопределить эту схему странного именования, добавив biosdevname=0 to grub, но, похоже, это не повлияет на этот новый хост даже после запуска update-grub и перезагрузка.

Есть ли способ указать ansible, чтобы найти основной nic и добавить строку сервера имен в /etc/network/interfaces для этих хостов? Мой текущий нерабочий сценарий ниже:

(обновленный рабочий пример из принятого ответа)

- hosts: all
  tasks:
    - name: setup resolv.conf in DMZ9 for Ubuntu 16.04 hosts
      when: ansible_default_ipv4.address is match("192.1.9")
      when: ansible_distribution_release is match ("xenial")
      interfaces_file:
        iface: "{{ ansible_default_ipv4['interface'] }}" 
        option: dns-nameservers
        value: 192.1.9.4 192.1.9.10

ansible_default_ipv4['interface'] содержит имя интерфейса. Я бегу

ansible all -i localhost, -m setup -c local

полезно определить, какие переменные определяет ansible.

Просто чтобы ответить на часть вопроса для всех, кто наткнулся на это, я закончил тем, что удалил пакет resolvconf вручную и смог отказаться от любого тидлинга с udev правила. Добавленный net.ifnames=0 boot arg вызывает недоумение, но, по-видимому, в некоторых случаях необходим для ethX именование nic. У меня есть другие хосты 16.04, которые были настроены несколько месяцев назад и не требуют этого аргумента загрузки, поэтому, по-видимому, задействовано что-то еще.