Я начинаю некоторые обновления Ubuntu 14.04 и попутно создаю несколько сценариев Ansible для использования на нескольких других хостах позже. Прежде всего, необходимо настроить /etc/resolv.conf
для указания на локальные ресурсы DNS.
Старый метод подготовки /etc/resolv.conf
представлял собой сценарий оболочки с awk / sed / grep, который запускал ssh
, который редактировал файл напрямую. Кажется, это запрет 16.04, который предупреждает об этом с помощью:
# Dynamic resolv.
# НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ вручную - ВАШИ ИЗМЕНЕНИЯ БУДУТ ПЕРЕЗАПИСАННЫ
.
На странице руководства для resolvconf
упоминается добавление DNS-серверов
в / etc / network / interfaces
, а также примечание, не рекомендующее использовать resolvconf
для добавления информации о сервере имен вручную:
Администратор может запустить resolvconf из командной строки ... но обычно в этом нет необходимости или желательно.
Кажется, единственный вариант - отредактировать / etc / network / interfaces
, но как мне указать сетевой интерфейс в playbook? Это не стандартный eth0..1..2
, а какая-то смесь алфавита вроде enp6s0
или ens18
, которую я не совсем понимаю. При другом обновлении Мне удалось переопределить эту схему странного именования, добавив biosdevname = 0
в grub, но, похоже, это не повлияло на этот новый хост даже после запуска update-grub
и перезагрузки .
Есть ли способ указать ansible найти основной ник и добавить строку сервера имен в / 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
вызывает недоумение, но, по-видимому, в некоторых случаях необходим для именования ethX
nic. У меня есть другие хосты 16.04, которые были настроены несколько месяцев назад и не нуждаются в этом загрузочном аргументе, так что, очевидно, задействовано что-то еще.