50-cloud-init.yaml 中的“对它的更改不会在实例中持续存在”实际上是什么意思

50-cloud-init.yaml 中的“对它的更改不会在实例中持续存在”实际上是什么意思

在最近的 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

我每次创建实例后都运行一次此脚本,就是这样......

相关内容