Cloud-init 是一个标准——可以毫不夸张地说,它是云提供商用来向云实例提供初始化和配置数据的标准。它最常用于新实例的首次启动,以自动执行网络设置、帐户创建和 SSH(安全 shell)密钥安装——使新系统联机并可供用户访问所需的任何操作。
在之前的文章 修改磁盘镜像以创建基于 Raspberry Pi 的家庭实验室 中,我展示了如何自定义像 Raspberry Pi 这样的单板计算机的操作系统镜像,以实现类似的目标。 使用 Cloud-init,无需向镜像添加自定义数据。 启用后,您的虚拟机、物理服务器,甚至微小的 Raspberry Pi,都可以在您自己的“家庭私有云”中像云实例一样运行。 新机器只需插入电源并打开,即可自动成为您的 家庭实验室 的一部分。
说实话,Cloud-init 的设计并非以家庭实验室为目标。正如我所提到的,您可以轻松地修改给定系统集的磁盘镜像,以便在首次启动后启用 SSH 访问并对其进行配置。 Cloud-init 专为需要容纳大量客户、维护少量镜像,并为这些客户提供一种无需为每个客户自定义镜像即可访问实例的机制的大型云提供商而设计。 拥有单一管理员的家庭实验室不会面临相同的挑战。
不过,Cloud-init 在家庭实验室中并非毫无价值。 教育是我在家中私有云项目中的目标之一,为您的家庭实验室设置 Cloud-init 是获得云提供商(无论大小)大量使用的技术经验的好方法。 Cloud-init 也是其他初始配置选项的替代方案。 您无需为家庭实验室中的每个设备自定义每个镜像、ISO 等,并在您想要进行更改时面临繁琐的更新,只需启用 Cloud-init 即可。 这减少了技术债务——还有什么比个人技术债务更糟糕的呢? 最后,在您的家庭实验室中使用 Cloud-init 可以使您的私有云实例的行为与您现在或将来可能拥有的任何公共云实例相同——真正的 混合云。
关于 Cloud-init
当配置为 Cloud-init 的实例启动并且服务(实际上,是 systemd 实现中的四个服务,用于在启动过程中处理依赖项)启动时,它会检查其配置中的 数据源,以确定它正在运行在哪种类型的云中。每个主要的云提供商都有一个数据源配置,用于告诉实例在哪里以及如何检索配置信息。然后,该实例使用数据源信息来检索云提供商提供的配置信息,例如网络信息和实例标识信息,以及客户提供的配置数据,例如要复制的授权密钥、要创建的用户帐户以及许多其他可能的任务。
检索数据后,Cloud-init 随后配置实例:设置网络、复制授权密钥等,最后完成启动过程。然后,远程用户可以访问它,并准备好使用 Ansible 或 Puppet 等工具进行进一步配置,或准备好接收工作负载并开始其分配的任务。
配置数据
如上所述,Cloud-init 使用的配置数据来自两个潜在来源:云提供商和实例用户。在家庭实验室中,您同时扮演这两个角色:作为云提供商提供网络和实例信息,并作为用户提供配置信息。
云提供商元数据文件
在您的云提供商角色中,您的家庭实验室数据源将为您的私有云实例提供一个元数据文件。 元数据 文件包含诸如实例 ID、云类型、Python 版本(Cloud-init 使用 Python 编写)或要分配给主机的公共 SSH 密钥之类的信息。 如果您不使用 DHCP(或其他 Cloud-init 支持的机制,例如镜像中的配置文件或内核参数),则元数据文件也可能包含网络信息。
用户提供的 user-data 文件
Cloud-init 价值的真正核心在于 user-data 文件。 由用户提供给云提供商并包含在数据源中,user-data 文件将实例从通用机器转变为用户队列的成员。 user-data 文件可以采用可执行脚本的形式,其工作方式与正常情况下的脚本相同,也可以采用 cloud-config YAML 文件的形式,该文件利用 Cloud-init 的模块 来执行配置任务。
数据源
数据源是云提供商提供的服务,它向实例提供元数据和 user-data 文件。 实例镜像或 ISO 被配置为告诉实例正在使用什么数据源。
例如,Amazon AWS 提供了一个 链路本地 文件,该文件将响应来自实例的 HTTP 请求,其中包含实例的自定义数据。 其他云提供商也有自己的机制。 幸运的是,对于家庭私有云项目,还有 NoCloud 数据源。
NoCloud 数据源允许通过内核命令以键值对的形式提供配置信息,或者作为挂载的 ISO 文件系统提供的 user-data 和元数据文件。 这些对于虚拟机非常有用,尤其是与自动化配合使用来创建虚拟机。
还有一个 NoCloudNet 数据源,其行为类似于 AWS EC2 数据源,提供 IP 地址或 DNS 名称,从中可以通过 HTTP 检索用户数据和元数据。 这对于家庭实验室中的物理机器(例如 Raspberry Pi、NUC 或剩余的服务器设备)最有帮助。 虽然 NoCloud 也可以工作,但它需要更多的人工干预——云实例的反模式。
适用于家庭实验室的 Cloud-init
我希望这能让您了解什么是 Cloud-init 以及它如何在您的家庭实验室中发挥作用。 这是一个被主要云提供商采用的不可思议的工具,在家中使用它可以进行教育和娱乐,并帮助您自动将新的物理或虚拟服务器添加到您的实验室。 未来的文章将详细介绍如何创建简单的静态和更复杂的动态 Cloud-init 服务,并指导您将其整合到您的家庭私有云中。
4 条评论