我开始对 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
,而是一些字母汤的混合,比如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
答案1
ansible_default_ipv4['interface']
包含接口的名称。我发现正在运行
ansible all -i localhost, -m setup -c local
有助于确定 ansible 定义了哪些变量。
答案2
只是为了回答这个问题的剧本部分,以便其他遇到此问题的人——我最终手动删除了 resolvconf 包,并且能够放弃任何规则调整udev
。添加的net.ifnames=0
启动参数令人费解,但在某些情况下,对于网卡命名来说,这显然是必要的ethX
。我有几个月前设置的其他 16.04 主机,它们不需要这个启动参数,所以显然涉及其他事情。