如何在 Ubuntu 16.04 上通过 ansible 添加解析器?

如何在 Ubuntu 16.04 上通过 ansible 添加解析器?

我开始对 Ubuntu 14.04 进行一些升级,并在此过程中创建一些 Ansible 剧本,以便以后在其他几台主机上使用。首先是设置/etc/resolv.conf指向本地 DNS 资源。

旧的配置方法/etc/resolv.conf是使用 awk/sed/grep 的 shell 脚本,该脚本运行后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但我该如何在剧本中指定网络接口?它不是标准的eth0..1..2,而是一些字母汤的混合,比如enp6s0ens18我不太明白。在另一次升级中,我能够通过添加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

答案1

ansible_default_ipv4['interface']包含接口的名称。我发现正​​在运行

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

有助于确定 ansible 定义了哪些变量。

答案2

只是为了回答这个问题的剧本部分,以便其他遇到此问题的人——我最终手动删除了 resolvconf 包,并且能够放弃任何规则调整udev。添加的net.ifnames=0启动参数令人费解,但在某些情况下,对于网卡命名来说,这显然是必要的ethX。我有几个月前设置的其他 16.04 主机,它们不需要这个启动参数,所以显然涉及其他事情。

相关内容