Я начинаю несколько обновлений 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, которые были настроены несколько месяцев назад и не требуют этого аргумента загрузки, поэтому, по-видимому, задействовано что-то еще.