我的 ssh 主机密钥已由 GCE 重置。发现
/var/lib/cloud/instances/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/ 中。
太复杂——简单的解决方案:
找到一个具有正确预配置云初始化的映像,并使用该映像启动您的实例。使用没有错误的映像。