如何将 Cloud-init 用于你的 Raspberry Pi 家庭实验室

自动化向你的家庭实验室添加新设备和用户,同时了解云行业标准。
109 位读者喜欢这篇文章。
gears and lightbulb to represent innovation

Opensource.com

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 随后配置实例:设置网络、复制授权密钥等,最后完成启动过程。然后,远程用户即可访问它,并准备好使用 AnsiblePuppet 等工具进行进一步配置,或准备好接收工作负载并开始其分配的任务。

配置数据

如上所述,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 服务,并指导你将它们整合到你的家庭私有云中。

接下来阅读什么
标签
Chris Collins
Chris Collins 是红帽的 SRE 和 OpenSource.com 的通讯员,对自动化、容器编排及其周围的生态系统充满热情,并且喜欢在家中娱乐性地重现企业级技术。

4 条评论

我所做的是修改 /etc/fstab 以在服务器上挂载 smb 共享,我在服务器上存储每台机器的配置。我在 rc.local 文件中包含了一行,用于根据主机名从服务器获取文件,主机名是我在部署之前在机器上设置的。还使用该 smb 共享进行每周备份。它在配置更新方面也很有效。每当我想添加软件包或文件集时。我所要做的就是重启?

真是个好主意!感谢分享。很高兴看到其他人是如何做事的。

回复 作者 Tim Copley (未验证)

有趣的文章,Chris。我必须做更多的阅读和研究。我:有几个 Raspberry Pi 闲置着。

Creative Commons 许可协议本作品根据 Creative Commons 署名-相同方式共享 4.0 国际许可协议获得许可。
© 2025 open-source.net.cn. All rights reserved.