如何将 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 是 Red Hat 的 SRE,也是 OpenSource.com 的通讯员,他对自动化、容器编排及其周围的生态系统充满热情,并喜欢在家中娱乐性地重现企业级技术。

4 条评论

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

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

回复 作者:Tim Copley (未验证)

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

© . All rights reserved.