Molecule自动化测试实战:如何构建 ansible-role-postgresql 的 PostgreSQL CI 流水线
【免费下载链接】ansible-role-postgresqlAnsible Role - PostgreSQL项目地址: https://gitcode.com/gh_mirrors/an/ansible-role-postgresql
ansible-role-postgresql是一个功能完整的 Ansible 角色(Role),用于在 RHEL/CentOS、Debian/Ubuntu 等 Linux 服务器上一键安装并配置 PostgreSQL 数据库——包括服务初始化、数据库/用户/权限创建、pg_hba.conf访问控制配置等。而 Molecule 则是专为 Ansible 角色设计的自动化测试工具。本文带你用 Molecule 为这个 PostgreSQL 角色搭建一条覆盖 6 种发行版的 CI 测试流水线,让你每次改动后都能自动验证"装数据库"这件事是否真的可靠 ✅
一、为什么需要用 Molecule 测试?
手写一个角色容易,保证它在每个操作系统上都能正确跑通才难。手动在 Ubuntu、Debian、Rocky Linux 上逐一验证既慢又不可重复。Molecule 的价值在于:
- 🐳真实环境验证:通过 Docker 容器拉起真实的操作系统镜像,像生产环境一样完整执行角色
- 🔄幂等性检查:自动跑两遍任务,确认第二次执行不产生任何变更(Ansible 的核心承诺)
- 🧪矩阵覆盖:通过环境变量切换发行版,一次流水线覆盖多个目标系统
二、项目结构快速认识
在动手前,先认识本项目的关键文件(路径均相对于仓库根目录):
| 路径 | 作用 |
|---|---|
molecule/default/molecule.yml | Molecule 测试场景配置 |
molecule/default/converge.yml | 测试收敛脚本(测试用例本身) |
defaults/main.yml | 角色默认变量(数据库、用户、认证方式等) |
tasks/main.yml | 角色任务入口,按发行版分发到 setup 任务 |
vars/Debian-12.yml、vars/RedHat-9.yml | 各发行版的版本/路径/包名差异变量 |
handlers/main.yml | 配置变更后的 PostgreSQL 服务重启处理器 |
meta/main.yml | 角色元信息(支持的发行版、Ansible 版本要求) |
💡 这套结构是"角色逻辑"与"测试逻辑"分离的典范:tasks/负责怎么做,molecule/负责怎么验。
三、三步搭建 CI 流水线
第 1 步:准备本地环境与测试场景
先克隆仓库并安装依赖:
git clone https://gitcode.com/gh_mirrors/an/ansible-role-postgresql cd ansible-role-postgresql pip3 install ansible molecule molecule-plugins[docker] docker核心配置文件是molecule/default/molecule.yml,关键设计有两点:
- 驱动选择 Docker:
driver.name设为docker,无需虚拟机即可模拟真实系统; - 发行版参数化:容器镜像写成
geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux9}-ansible:latest,通过环境变量MOLECULE_DISTRO即可切换任意发行版,默认回落到 Rocky Linux 9。
此外还开启了privileged: true和宿主 cgroup 挂载,保证容器内 systemd 与 PostgreSQL 服务能正常启动。
第 2 步:编写 converge 测试脚本
测试用例位于molecule/default/converge.yml,思路是"给输入 → 跑角色 → 断言结果":
- 输入(测试变量):声明数据库
example、两个用户jdoe和longjohnsilver,以及对应的权限条目(一个拥有数据库 ALL 权限,一个仅拥有模式内对象权限); - 兼容性处理:
pre_tasks中针对 Fedora 30+ / RHEL 8+ 容器只有C.UTF-8locale 的情况,自动调整数据库语言环境; - 断言:
post_tasks中以 postgres 系统用户执行pg_ctl status,验证 PostgreSQL 进程真实在运行,而非仅"任务没报错"。
第 3 步:接入 CI 做矩阵测试
CI 流水线定义在.github/workflows/ci.yml,包含两个 Job:
- Lint Job:安装
yamllint对全部 YAML 文件做语法与风格检查,拦截低级错误; - Molecule Job:设置
fail-fast: ${{ !contains(github.event_name, 'pull_request') }}(PR 上跑完全部矩阵,主分支推送时快速失败),矩阵覆盖ubuntu2604、ubuntu2404、ubuntu2204、debian11、debian12、debian13共 6 个发行版,每个 Job 执行:
molecule test # 通过环境变量 MOLECULE_DISTRO 注入当前矩阵的发行版触发时机为:PR 提交、master 分支推送、以及每周五凌晨 3 点的定时巡检——防止上游容器镜像变化导致回归。
四、molecule test到底跑了几步?
一次molecule test是完整生命周期,新手最容易忽略其中的"隐形测试":
- dependency:拉取角色依赖;
- create:创建容器实例并等待就绪;
- converge:执行角色安装(真正的功能测试);
- idempotence:再跑一遍 converge,检查 diff 是否为空——这是保证角色幂等性的关键;
- verify:执行断言(本项目的验证放在 converge 的
post_tasks中完成); - destroy:销毁容器,不留垃圾。
五、新手常见问题 FAQ
Q1:如何在本地只测某一个发行版?
MOLECULE_DISTRO=ubuntu2404 molecule test不设置时默认使用rockylinux9。
Q2:幂等性检查失败怎么办?
通常是任务缺少changed_when,或模板渲染结果不稳定(如时间戳、无序输出)。检查 converge 第二遍执行时哪些任务仍报告changed。
Q3:为什么容器要privileged: true?
PostgreSQL 由 systemd 管理且需要访问设备与 cgroup,非特权容器可能无法完成服务初始化。
Q4:如何查看角色支持哪些平台?
见meta/main.yml中的platforms字段——涵盖 Fedora 34~38、Ubuntu xenial~resolute、Debian buster~trixie、ArchLinux 等,与 CI 矩阵互为补充。
六、总结
回顾这条流水线的设计亮点:
- ✅一个配置文件驱动多发行版:靠
MOLECULE_DISTRO环境变量实现矩阵化测试; - ✅测试贴近真实:不只检查"任务成功",还以系统用户身份验证
pg_ctl status; - ✅双保险质量门禁:YAML Lint 拦截语法问题,Molecule 拦截功能回归;
- ✅定时巡检:每周五自动运行,防镜像漂移带来的静默故障。
照这套模式,你也可以为自己维护的任意 Ansible 角色搭建出同样可靠的 PostgreSQL CI 测试流水线 🚀
【免费下载链接】ansible-role-postgresqlAnsible Role - PostgreSQL项目地址: https://gitcode.com/gh_mirrors/an/ansible-role-postgresql
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考