我有一台 DigitalOcean 服务器,正在通过 cloud-init 配置。使用 Ubuntu Bionic Beaver,这会创建一个/etc/netplan/50-cloud-init.yaml
包含名称服务器地址的 netplan 文件。但是,覆盖这些地址并不简单。
在 Bionic Beaver 上,/etc/resolv.conf
由systemd-已解决服务。我可以编辑全球的名称服务器如下:
echo 'DNS=1.1.1.1 1.0.0.1' >> /etc/systemd/resolved.conf
service systemd-resolved restart
但是,这不会影响 cloud-init 设置的特定于接口的名称服务器。为此,我必须直接编辑 netplan 文件或以某种方式覆盖它。我可以直接编辑文件,但这不太适合自动化。netplan 文档说存在等级制度对于 netplan YAML 文件:
配置文件可以存在于三个不同的位置,其优先级从高到低如下:
- /运行/netplan/*.yaml
- /etc/netplan/*.yaml
- /lib/netplan/*.yaml
按字母顺序排列的后续文件(无论在哪个目录中)如果键不存在则修改键;如果存在则覆盖先前的键。
鉴于此,我编写了一个“按字母顺序排列的文件”,如下所示:
# /etc/netplan/51-cloudflare-dns.yaml
network:
ethernets:
eth0:
nameservers:
addresses:
- 1.1.1.1
- 1.0.0.1
根据上述指导,我预计这会将 eth0 的名称服务器替换为新名称服务器。但是,运行netplan apply
附加到接口的名称服务器列表中,而不是替换它们,如下所示systemd-resolve --status
:
Link 2 (eth0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 8.8.8.8
8.8.4.4
1.1.1.1
1.0.0.1
我如何覆盖 netplan 的每个接口名称服务器,而不是附加到它们?欢迎使用在重启后仍然存在的基于文件和命令行的解决方案。
答案1
这是我发现的唯一方法:
将其重命名/etc/netplan/50-cloud-init.yaml
为/etc/netplan/51-network-settings.yaml
并根据需要进行编辑。确保删除文件的旧版本,以防止您的名称服务器被附加到旧版本。然后创建一个名为 的文件,其/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
内容为network: {config: disabled}
,这将阻止 cloud-init 重新创建其输出文件。
这样做的缺点是,如果网络配置发生变化,cloud-init 将不再管理设置。我认为将 cloud-init 配置为仅更改名称服务器会更好,但我没有找到这样做的方法。