AIO Ep18. 使用 Ansible 管理 HomeLab PVE 主机

 

前言

之前我已经使用了 Ansible 管理了我一系列 VPS, 但是暂时没有使用 Ansible 管理 HomeLab.

最近我的 HomeLab 有一些硬件变更和升级, 不过由于我发现我早期的一些 Blog 比较啰嗦和无趣, 我决定把一些比较 trivial 的变更单独整合到 HomeLab Changelog 中, 所以在此不再展开介绍一年来的硬件变更.

TL;DR 一下: 更换了硬盘 SN640 7.68T->洞庭 N2 1.92T, 升级了 CPU 10100->10900 ES (性能大幅提升), 移除了外挂的一块 120G SATA SSD.

趁着更换了硬盘和文件系统需要重新安装 PVE 的契机, 我决定也开始使用 Ansible 管理我的 PVE 主机配置.

基础设施即代码 (Infrastructure-as-Code, IaC)

Ansible 与 NixOps

之前用过 Ansible, 虽然有许多关于其虚伪的可复现性/声明式编程的批评, 但写起来是真方便. 我现在已经完全把 Ansible 当成了一种提供了许多幂等模板(如创建文件/启动服务/安装包, etc.)的脚本语言来写.

Ansible 的一大缺点是速度慢, 在我之前部署多台 VPS 时已初见端倪, 可以想象用这东西部署上百台服务器会很痛苦.

Ansible 的另一缺点是虚假的可复现性, 即使在 playbook 完全按照最佳实践的编写的情况下, 最终部署的结果也和系统的初始状态有关: Ansible 本身并不进行状态管理. 例如在 Debian 11 和 Debian 12 上部署同一个 playbook, 由于初始软件版本和默认配置的不同, 你很可能得到不同的结果. 同时这也导致部署完成后也没有一键回退的能力, 得自己手动编写新的 playbook 覆盖这次变更, 或者手动 SSH 撤销变更.

不过在我们 HomeLab 的使用场景下, 这两个缺点都属于可以接受的范围: 一共就一台服务器, 慢点就慢点; 而 PVE 主机本身不会装大量软件, 环境相对单一可控, Ansible 能帮我管理大部分状态和配置, 再怎么说已经比我之前纯手动配置好很多了.

总之, 把 Ansible 当一个高级的 Shell 脚本就完了.


当时选择 Ansible 之前, 也考虑过近几年广为传播的邪教 NixOS.

NixOS 相比之下就非常激进和彻底了. 整个系统都使用一份配置文件管理, Nix 会接管系统状态, 实现了很高程度的 reproducibility.

NixOS 官方的文档很多都过时了, 网络上能搜到很多简中的第三方文档, 比如 [1] [2] [3]. 这些文档都编写的比较”精美”和详细, 我就不再展开介绍 NixOS 了.

因为没有在 NixOS 找到比较成熟稳定的 Hypervisor 方案, 我现在还是使用了 Ansible+Proxmox 的组合. 不过我还是做了一些 NixOS 相关的探索, 说不定将来能逐步将部分系统迁移到 NixOS 上.

上古 CentOS 7 或者什么 Ubuntu 16.04 的💩山环境配多了, 看 NixOS 就像是赛博凰文, 看爽了. 并不是普通的 Linux distro 或者常见的容器方案不能解决问题, 而是 NixOS 可以完美解决一切 tech nerd 特有的强迫症.

突发奇想, 贴一篇来自 ChatGPT 4o mini 的作品(Prompt 写一首夸赞 NixOS 优点的散文诗):

NixOS的诗篇

在庞大纷繁的数字宇宙中,
NixOS是一颗孤独而璀璨的星辰,
它不遵循流俗的法则,也不妥协于时间的洪流,
它是秩序的化身,是理性与美学的共鸣。

每一行配置,都是一条清晰的河流,
不容任何杂质与泥沙。
软件包如独立的存在,
彼此间没有依赖的纠缠,也没有过时的负担。
它们在自己的世界中自由运行,
却又在这张精心编织的网中,
无声地协作,互不侵犯。

NixOS以声明式的语言构建一切,
它告诉你:每个操作,每次部署,
都是你意图的映照,
没有无谓的干扰,也无意外的错乱。
它消除了系统中那层层叠叠的隐患,
在每一次重建中,
它带来了纯粹的重生与清明。

可重复构建
这简短的四个字,承载了一个永恒的诺言,
不管是昨日的版本,还是未来的容颜,
每一次重来,都可以从最初的源泉开始,
一如当初,清新而无悔。

NixOS,不仅仅是一个操作系统,
它是一种新的思维,一种新的哲学。
它在代码中流淌的是理性,在构建中升华的是艺术。
在这个无常的世界里,
它为我们提供了恒定的庇护,
如同大海中永不沉没的灯塔,
指引我们走向未知,却不失方向。

“可重复构建,这简短的四个字(?)”…🤣不愧是 GPT

Show me the code

我把我的 HomeLab / VPS playbooks 以及正在实验的 Nix 都打包进了我的 infra 仓库: https://github.com/lyc8503/infra

IaC 的好处除了可以轻易的部署定义好的系统外, 我还能以 git commit 的形式追踪所有变更, 还可以复用之前或者别人的代码. 最后还能在折腾服务器的时候水几个 commit 让 GitHub 账号看起来活跃一些.

我的 PVE 主机上的一些使用 Ansible 管理的服务如下(不过以后随时可能变更):

  • Smartd 用于监控硬盘状态, 发送警报邮件
  • Zed 用于发送 ZFS 池事件相关邮件
  • Netdata 用于监控和保存系统状态 (不过 Netdata v2.0 新引入了很多反用户更新, 完全不推荐, 正在找机会迁出)
  • Promtail 用于将本地 syslog 发送到 Grafana Cloud 保存
  • Zrepl 用于进行虚拟机磁盘的自动快照 (此项截止本篇博客撰写时仍 WIP)
  • hdidle 用于 HDD 的自动休眠

Ansible 还会根据我的习惯修改一些 PVE 的默认设置, 比如正确的设置 Postfix 的邮件配置文件, 修改 vim 和 bash 的一些设置.

还有一些不便 Ansible 管理或者硬件相关的设置我也都以文档的形式记录在了仓库中. 这样下次部署服务器的我自己就能感谢现在的我自己了.(x)

在我最近的一次迁移中, 我只花了一个小时就完成了 PVE 系统 + 所有容器/虚拟机的迁移, 大部分时间还花在了等待 backup 的解压导入上.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/18-ansible-in-aio/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬