为什么 cloudinit 要使用 iid-datasource-none?

为什么 cloudinit 要使用 iid-datasource-none?

我的 ssh 主机密钥已由 GCE 重置。发现

/var/lib/cloud/instances/iid-datasource-none

已创建。

https://cloudinit.readthedocs.io/en/latest/topics/datasources/fallback.html?highlight=iid-datasource-none

对于原因/预防没有启发。有人知道 cloudinit 的这个方面是如何工作的吗?

答案1

iid-datasource-none 是数据源 None 报告的(“假”)实例 id。

当 cloud init 发现 instance_id 已更改或无法找到上次运行的数据时,将重新创建主机密钥(与其他所有密钥一样)。如果您重新创建了实例,则会出现以下预期行为:主机密钥应该特定于某个实例。请参阅下文了解如何获得不同的行为。

这是如何工作的以及这是什么:

Cloud init 尝试对实例进行基本配置。为此,它需要一些有关需要配置什么以及配置哪些设置的信息。这些信息来自数据源。可以使用不同的数据源 - 具体取决于您的需求。其中包括 DataSourceGCE 和 DataSourceNone。在配置中,cloud init 有一个 datasource_list,它是要尝试的数据源数组。然后是 ds-identify.cfg,它告诉 cloud init 如何测试和选择数据源。

在您的案例中,测试结果选择了 DatasourceNone,当没有其他数据源时,这是一种后备方案。由于这是一种后备方案,它总是返回相同的硬编码实例 ID。

为什么 cloud init 会选择它

它在 datasource_list 中没有找到任何其他已启用且正在运行的数据源。

可能原因:

  • 用于建立实例的图像在其 datasource_list 中没有 DataSourceGCE。
  • DataSourceGCE 已被禁用。
  • 内核有一个 ds= 选项,它可以覆盖其他设置。

可能 Wokaround

查看 /etc/cloud/cloud.cfg 和 /etc/cloud/cloud.cfg.d/ 中的其他文件,检查是否有任何文件中包含“datasource_list:”选项。确保它包含如下所示的 GCE:

datasource_list: ['GCE','None']

如果不存在包含此行的文件,则创建 /etc/cloud/cloud.cfg.d/datasource.cfg 并包含上述内容。在实例的 shell 上执行以下操作:

cloud-int clean
reboot

您最终应该会得到来自 Google 的实例 ID。如果这不起作用,请检查您是否已禁用它(例如在 ds_identify 中),以及是否可以从您的实例访问 gce 元数据。

如果它有效,请使用新设置重新创建图像并使用它。

对于主机密钥

创建文件 /etc/cloud/cloud.cfg.d/ssh.cfg 输入

ssh_keys:
   rsa_public: |
       <your rsa hostkey>
   rsa_private: |
       <your rsa hostkey>
   ecdsa_public: |
       <your ecdsa hostkey>
   ecdsa_private: |
       <your ecdsa hostkey>
   ed25519_public: |
       <your ed25519 hostkey>
   ed25519_private: |
       <your ed25519 hostkey>

它是 Yaml,因此请确保缩进正确。您可以使用 ssh-keygen 生成密钥,或从实例的 /etc/ssh 中的相应文件复制内容(因此任何重新创建的实例都会获得相同的密钥)

cloud-init clean 
reboot

...并创建一个图像来保存您的更改。

您可以将配置主机密钥的行放置在以“#cloud-config”开头的 user_data 中(如果是多部分则为某一部分),而不是 /etc/cloud/cloud.cfg.d/ 中。

太复杂——简单的解决方案:

找到一个具有正确预配置云初始化的映像,并使用该映像启动您的实例。使用没有错误的映像。

相关内容