使用 Ansible 管理您的 Raspberry Pi 集群

解决企业中难以触及的 Raspberry Pi 更新问题的方案。
117 位读者喜欢这个。
Raspberries with pi symbol overlay

Dwight Sipler 在 Flickr 上

Raspberry Pi 是一款小巧、多功能的设备,对于普通人来说,与现实世界交互变得轻而易举。Raspberry Pi 基金会的想法是以如此低的成本销售这些设备,以至于弄坏一个会令人难过,但不会造成灾难。这是它作为教育工具获得巨大成功的原因之一。但它们的实用性并没有逃过商业界的眼睛,在商业界,它们正成为自动化物理世界的宝贵工具。

无论是用于驱动信息显示、自动化测试、控制机械、监控环境还是执行其他任务,企业都将 Raspberry Pi 视为执行重要任务的严肃设备。每个型号都有较长的产品生命周期——即使是较旧的型号(1B+2B3A+3B3B+)也将至少生产到 2026 年 1 月。它们几乎没有过时的风险,因此您可以保持足够大的库存,并将它们视为您可以更换而不是修复的模块化组件。

稳定的硬件与不断变化的软件

虽然您可以依赖硬件保持不变,但软件的情况并非如此。Raspberry Pi 的官方支持操作系统是 Raspberry Pi OS(以前称为 Raspbian),应定期更新以获取最新的安全和错误修复

这就出现了一个问题。由于 Raspberry Pi 提供了物理世界和虚拟世界之间的桥梁,因此它们通常安装在难以触及的位置。它们也往往由硬件人员安装,通常是工厂的电工和产品的装配技术人员。您不希望浪费他们的时间,让他们连接键盘和显示器,登录以运行 raspi-config,使用 apt-get 安装软件,然后配置软件。

 

由于 Raspberry Pi OS 从 SD 卡启动,一种方法是始终在 SD 卡上维护最新版本的软件,安装人员只需插入(并用热熔胶粘合)即可。优秀的质量保证 (QA) 部门会将 SD 卡置于版本控制之下,因此您可以确信所有新安装都是最新的版本。但是,此解决方案维护成本很高,因为每次软件更新都需要准备新映像并将其刻录到所有 SD 卡。它也没有解决如何修复所有现有设备的问题。在某些情况下,您可能需要为执行特定工作的特定 Raspberry Pi 创建自定义映像,并且可能不可避免地需要安装人员连接键盘和显示器来配置某些内容。

 

更好的方法是使用相同的最小基本操作系统安装,然后使用网络启动来维护网络上的所有自定义和更新。这只需要维护一个基本映像,这更容易管理,因此如果您有可靠的网络基础设施,这是一个好方法。不幸的是,并非所有网络都支持这种方法;正如 Raspberry Pi 的网络启动文档所说:“由于可用的网络设备种类繁多,我们无法保证网络启动适用于任何设备。” 可悲的是,这在 Raspberry Pi 4 上已不再是一种选择。此外,当设备长时间断开网络连接时,这也不是一种选择。

因此,更好的目标是生成一个通用的基本 Raspberry Pi OS 映像,该映像不会经常更改,但一旦安装,就可以自动进行自定义、维护和远程管理。

创建基本映像

您的基本映像几乎肯定需要对默认 Raspberry Pi OS 映像进行少量更改。幸运的是,只有在 Raspberry Pi OS 映像更新或您需要更改配置中的某些内容时,才需要重新创建基本映像。Raspberry Pi OS 主要版本之间的典型时间约为两年,这是一个很好的目标维护生命周期。它为您提供了充足的时间来更换旧设备以换取新设备,同时保持 QA 部门维护版本的可管理性。较旧的版本在发布后一段时间内仍将获得安全和错误修复支持。

在我 2017 年的 Hacker Public Radio 节目 安全地在默认 Raspbian 映像中启用 SSH 中,我详细介绍了自动化更新基本映像的步骤。我创建的脚本

  • 下载最新的映像 ZIP 文件
  • 验证其是否有效
  • 提取映像本身
  • 启用 SSH 以进行安全远程管理
  • 更改 root 和 Pi 用户的默认密码
  • 保护 Pi 上的 SSH 服务器

从那时起,我增强了脚本以

  • 启用与 WiFi 网络的连接 (wpa_supplicant.conf)
  • 从 INI 文件加载其配置,将敏感信息与主脚本分开。
  • 使用 losetup 简化挂载映像
  • 创建一个 firstboot 脚本

这些更改确保设备在部署之前被锁定。您可以在 GitHub 上找到 fix-ssh-on-pi 脚本的更新版本。

现在是修改脚本以适应您的环境的好时机,尤其是添加身份验证所需的任何安全密钥或数字证书。但是,最好暂时不要添加任何自定义应用程序或配置,因为它们可以稍后添加。在大多数情况下,该映像的行为将类似于通用的 Raspberry Pi OS 映像,这意味着它将像往常一样启动并调整 SD 卡大小,并安装典型的默认软件和固件。

值得注意的添加是对 firstboot 脚本的支持。这是使 Raspberry Pi 在首次配置自身后运行您的自定义配置的粘合剂。同样,我鼓励您修改脚本以适应您的环境。例如,您可以让设备注册自身、运行系统测试和诊断程序、下载客户端应用程序等。

[ 提升您的自动化专业知识。获取 Ansible 清单:迁移到 Red Hat Ansible Automation Platform 2 的 5 个理由 ]

如果您不想自定义它,它将执行使您的 Raspberry Pi 连接到网络所需的最低限度操作,以便网络管理软件可以唯一地识别它。

设置自动管理

如果您在 DevOps 环境中管理服务器,那么对于使用配置管理软件来控制您的 Raspberry Pi 设备的想法,您不会眨眼。如果您使用的工具需要代理,您可以将代理软件作为基本映像的一部分包含在内。但是,考虑到 Raspberry Pi 上的资源,像 Ansible 这样的无代理解决方案可能是最佳选择。它只使用 SSH 和 Python,不需要客户端上的任何其他软件,控制软件易于安装,并且易于使用。

您只需要 Ansible 软件、要管理的设备列表(保存在清单文件中)以及剧本(一组您希望执行的指令)。例如,您可以使用 apt update && apt full-upgrade 等效的 apt 模块更新基本 Raspberry Pi OS 映像。剧本将是

  - name: Run the equivalent of "apt-get update" as a separate step
    apt:
      update_cache: true
      cache_valid_time: 3600
  - name: Update all packages to the latest version
    apt:
      upgrade: dist

您可能会认为为 Raspberry Pi 安装 Ansible 是小题大做,但我发现如果您需要管理两台或三台以上的计算机,这是值得的。使用 Ansible 还可以使您的网络更卫生——您的清单经过审计并列在主机文件中,软件安装通过其剧本记录,数据和配置与设备隔离,因此更容易定期备份。

根据 Wikipedia,Ansible 的设计目标包括

  • 本质上是最小化的。管理系统不应在环境上施加额外的依赖性。
  • 一致性。使用 Ansible,应该能够创建一致的环境。
  • 安全。Ansible 不会将代理部署到节点。托管节点上只需要 OpenSSH 和 Python。
  • 高度可靠。精心编写的 Ansible 剧本可以是幂等的,以防止在托管系统上产生意外的副作用。完全有可能编写一个编写不当的非幂等剧本。
  • 所需学习量最少。剧本使用基于 YAML 和 Jinja 模板的简单且描述性的语言。

任何具有正确授权的人都可以配置设备,但您可以使用标准 Unix 权限来限制授权。您可以对剧本应用细粒度的访问权限,例如,测试操作员只能访问您安装的测试和诊断工具。

工作原理

想象一下,您有一家小部件工厂,其产品中包含 Raspberry Pi。您的设施团队也使用它们来监控环境工厂和安全。同样,工程团队在制造监控过程中的生产线上使用这些设备。IT 部门将它们用作访问总部企业资源规划 (ERP) 系统的可支配的哑终端。在所有这些情况下,都需要将停机时间保持在最低限度。

我们的目标是向每个团队交付完全相同的设备和完全相同的映像。

准备映像

所有阶段的共同点是准备映像本身。克隆来自 github 的 fix-ssh-on-pi.bash 脚本后,需要一次性操作来编辑和重命名文件 fix-ssh-on-pi.ini_examplefix-ssh-on-pi.ini,以及 wpa_supplicant.conf_examplewpa_supplicant.conf

您只需在 Raspberry Pi OS(Raspbian) 更新或您更改了配置文件时运行脚本。我建议将其作为您的 DevOps 工作流程的一部分包含在内。如果您还没有到位,那么可以使用简单的 cron 作业来自动化它。

我建议设置一个 Raspberry Pi 工作站,专门用于在存储室中刻录最新的 SD 卡。一旦将新卡插入外部 SD 卡读卡器,这将自动从网络刻录最新的映像。凭借一些想象力和 3D 打印机,可以制造一个漂亮的单元,用于提供有关进度的反馈。

当需要 Raspberry Pi 时,仓库保管员可以取出完成的 SD 卡之一,并将其包含在工作订单中。

清单/主机文件

在我们的虚构示例中,设备的角色将由其连接到的网络位置决定。因此,我们需要能够在 Raspberry Pi 连接到网络后识别它们。您如何处理这个问题将完全取决于您的网络配置以及您可以使用的工具。我建议收听 operat0r 的名为 hpr3090 :: 在企业网络上定位计算机的节目,其中包含有关如何执行此操作的一些很好的技巧。

每个部门都将拥有自己的配置服务器,运行 Ansible 软件,这当然可以是另一台 Raspberry Pi。正是标准的 unix/ssh 权限决定了组织内谁有权访问什么内容。在 hpr3080 :: Ansible ping 节目中,我详细介绍了安装和排除 Ansible 的绝对基础知识。从那时起,klaatu 添加了 hpr3162 :: Ansible 简介,这是对该主题的总体介绍。

配置服务器如何了解新设备可以是主动的或被动的。

您可以让 First Boot 脚本主动调用 URL 以注册自身。您需要有一个 Web 应用程序侦听并使用收到的信息在 Ansible 清单中注册新主机。

对于设备更换频率不高且您希望尽快配置设备的部门来说,这可能是一个好方法。例如,当更换水质监测站时,最好让它注册。然后,电工可以通过智能手机应用程序选择要部署到设备的确切剧本。

另一方面,如果您要不断安装设备(如在生产线上),则被动方法可能更好。在这种情况下,我们可以假设在生产线网络上找到的任何新设备都将在生产线开始时安装我们的测试和诊断软件。这也可以在发货前自动删除。

fix-ssh-on-pi.bash 所做的更改之一是将每个 Raspberry Pi 的主机名重命名为基于其 以太网 MAC 地址的版本。例如,以太网 MAC 地址 dc:a6:32:01:23:45 将导致 主机名dca632012345

当 Raspberry Pi 完成首次启动序列时,第 3 次自动重启将从您的 DHCP 服务器请求 IP 地址,该主机名将(可能)在办公室 DNS 网络中可用。

此时,可以使用类似 ssh dca632012345ssh dca632012345.localssh dca632012345.lan 或在我们的示例中 ssh dca632012345.production.example.com 的方式访问您的 Raspberry Pi。

我在 github 上包含了一个小脚本,用于根据 以太网 MAC 地址定位 Raspberry Pi。我最近在我的 Hacker Public Radio 节目 在网络上定位计算机 中讨论了这一点

# ./put-pi-in-ansible-host.bash | tee all_pies.ini
[all_pies]
b827eb012345 ansible_host=192.168.1.123
dca632012345 ansible_host=192.168.1.127
b827eb897654 ansible_host=192.168.1.143
dca632897654 ansible_host=192.168.1.223

在我 Hacker Public Radio 的 Ansible ping 节目中,我使用了 YAML 清单文件而不是上面的 INI 版本。

执行剧本

无论配置服务器如何了解设备,您现在都知道它们存在。在此示例中,您将根据设备所在的子网部署不同的剧本。

您可能尝试的最简单的剧本是这个(来自 Ansible ping,可在 GitHub 上找到)

- name: Test Ping
  hosts: all
  tasks:
  - action: ping

您现在应该拥有与新设备通信所需的一切

ansible-playbook --inventory-file all_pies.ini ping-example-playbook.yaml

通过修改剧本,您可以以您喜欢的任何方式更新和配置您的设备。我使用它来创建用户、将系统更新到最新版本、添加和删除软件以及执行其他配置。有很多关于更新系统的优秀示例,例如 Ansible apt update all packages on Ubuntu / Debian Linux 教程。

此时,设备不再是通用的。您将知道每个 Raspberry Pi 应具有的确切角色,并且您可以据此配置它。它的自定义程度将取决于剧本,但我建议为 Pi 需要执行的每个任务设置特定的 Ansible 角色。例如,即使您的部件工厂只有一个水质监测站,您也应该为其定义一个角色。这不仅允许您在必要时快速部署相同的替换件,而且您还在记录该过程,这可能是 ISO 9000 等认证所要求的。

您现在有办法审核对网络的更新是否到位并定期完成。希望这将使您的设备在多年的服务中保持安全。此方法也适用于您运送的产品,因为它们可以通过现场服务工程师操作的热点进行更新。在常规系统维护期间,Raspberry Pi 使用 wpa_supplicant.conf 文件中提供的凭据自动更新。

使管理更轻松

我希望这能让您大开眼界,了解如何更轻松地处理许多设备的管理。您入门所需的一切都是您的 PC 或笔记本电脑和 Raspberry Pi。无论是小规模工作还是扩展到数百台设备,刻录通用映像、创建设备清单和部署剧本的原理都是相同的。

接下来阅读什么
Ken Fallons Photo
Ken Fallon 感到非常幸运,能够生活在硬件和软件黑客如此容易实现的时代。为了回馈社区,他帮助运营了地球上运行时间最长的社区播客 Hacker Public Radio。

1 条评论

嗨,Ken,

从概念和更新的脚本 POV 来看,这看起来非常有用!

我不是开发人员(只是产品经理类型),但我的开发人员正在寻求为 RPi 编码远程权限,就像家庭用户 TV Amlogic ARM 盒子一样,这些盒子最初运行 Android,但可以使用 Kodi JeOS 这样的 coreelec 进行 SD 启动。

任务是通过设备特定的服务器 DB 配额来打开/关闭设备应用程序(Kodi、VLC、wlan0)。一个问题是家庭路由器/防火墙后面的设备,因此需要 ansible-pull。

我的假设是 Ansible 可以在这里完成这项工作,而不是为自动化权限配置 https restAPI;并为远程管理员登录到特定设备配置反向 SSH 以供多个设备使用。
也就是说,Ansible 应该内置这些模块?

无论如何,您的结构和代码应该有所帮助...会保持联系!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© 2025 open-source.net.cn. All rights reserved.