Cloud-init 是一个标准——毫不夸张地说,它是云提供商用来向云实例提供初始化和配置数据的标准。它最常用于新实例的首次启动,以自动化网络设置、帐户创建和 SSH(安全外壳)密钥安装——任何使新系统上线并可供用户访问所需的操作。
在之前的文章修改磁盘镜像以创建基于 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 编写并使用 Python 的)或要分配给主机的公共 SSH 密钥等信息。如果你不使用 DHCP(或 Cloud-init 支持的其他机制,例如镜像中的配置文件或内核参数),则元数据文件也可能包含网络信息。
用户提供的用户数据文件
Cloud-init 价值的真正核心在于用户数据文件。用户数据文件由用户提供给云提供商并包含在数据源中,用户数据文件将实例从通用机器转变为用户集群的成员。用户数据文件可以采用可执行脚本的形式,其工作方式与脚本在正常情况下相同,也可以采用 cloud-config YAML 文件的形式,该文件利用 Cloud-init 的模块来执行配置任务。
数据源
数据源是云提供商提供的服务,它向实例提供元数据和用户数据文件。实例镜像或 ISO 配置为告知实例正在使用的数据源。
例如,Amazon AWS 提供一个 链路本地文件,该文件将响应来自实例的 HTTP 请求,并返回实例的自定义数据。其他云提供商也有自己的机制。幸运的是,对于家庭私有云项目,还有 NoCloud 数据源。
NoCloud 数据源允许通过内核命令以键值对的形式或以作为已挂载 ISO 文件系统提供的用户数据和元数据文件的形式提供配置信息。这些对于虚拟机非常有用,尤其是在与自动化结合以创建虚拟机时。
还有一个 NoCloudNet 数据源,其行为类似于 AWS EC2 数据源,提供 IP 地址或 DNS 名称,从中可以通过 HTTP 检索用户数据和元数据。这对于你家庭实验室中的物理机器(例如 Raspberry Pi、NUC 或剩余的服务器设备)最有帮助。虽然 NoCloud 可以工作,但它需要更多的人工关注——这与云实例的反模式。
家庭实验室的 Cloud-init
我希望这能让你了解 Cloud-init 是什么以及它如何在你的家庭实验室中发挥作用。它是一个令人难以置信的工具,受到主要云提供商的青睐,在家中使用它可以寓教于乐,并帮助你自动化地向你的实验室添加新的物理或虚拟服务器。未来的文章将详细介绍如何创建简单的静态和更复杂的动态 Cloud-init 服务,并指导你将它们整合到你的家庭私有云中。
4 条评论