前言
之前我已经使用了 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬