我如何覆盖 netplan 的每个接口名称服务器,而不是附加到它们?

我如何覆盖 netplan 的每个接口名称服务器,而不是附加到它们?

我有一台 DigitalOcean 服务器,正在通过 cloud-init 配置。使用 Ubuntu Bionic Beaver,这会创建一个/etc/netplan/50-cloud-init.yaml包含名称服务器地址的 netplan 文件。但是,覆盖这些地址并不简单。

在 Bionic Beaver 上,/etc/resolv.confsystemd-已解决服务。我可以编辑全球的名称服务器如下:

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 配置为仅更改名称服务器会更好,但我没有找到这样做的方法。

相关内容