在最近的 Ubuntu 中,netplan 是配置网络适配器的默认方式。我想在我的一个设备上使用静态 IP,有一些指南教你如何做到这一点。一些指向编辑50-cloud-init.yaml。但该文件有一个不祥的警告:
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
askubuntu 上的一个答案引用了这一点,让用户这样做. (请注意,它已将渲染器设置为网络。)
哪种方法正确?它们都有效吗?
最令人困惑的是,“在实例中持久化”是什么意思?这些设置在重启后仍然能够很好地持久化。我预计什么时候会丢失 50-cloud-init.yaml 中的设置?
答案1
“不能跨实例”警告意味着如果您在仍需执行其第一次 cloud-init 运行(在启动时)的图像中对 yaml 文件输入更改,则这些更改将被 cloud-init 覆盖。
Cloud-init 用于在首次启动时配置内容。为此,它会在首次(甚至后续)启动时更改文件。50...yaml 文件就是其中之一。
一旦 cloud-init 在图像上第一次运行,它就不会再次运行这些更改。
因此,警告建议不要更改容器、虚拟机等的原始、未使用的系统映像上的文件。
顺便说一下,“cloud-init clean”命令会将 cloud-init 状态恢复为“从未运行过”,因此也会重新生成 50....yaml 文件。
答案2
/etc/netplan/50-cloud-init.yaml 的更改在重启后仍然有效,但如果您备份一个实例并将其还原为新实例则不会有效(即使您的备份是在重启后完成的)。
我猜想解决方案描述将 /etc/network/interfaces 转换为 netplan使其在各个实例之间持久存在,但我发现无论如何我都必须在每个实例上更新 MAC 地址......
所以我写了一个小脚本:
- 将我的配置附加到 /etc/netplan/50-cloud-init.yaml 的末尾
- 运行
sudo netplan apply
我每次创建实例后都运行一次此脚本,就是这样......