molecule 是专为 ansible 角色设计的集成测试框架,通过在 docker 等隔离环境中部署角色并验证其安装、配置、服务状态等是否符合预期;支持多平台测试、非 root 用户执行、ansible 或 testinfra 验证方式,以及 converge/verify/destroy 等调试命令。

Molecule 是专为 Ansible 角色设计的测试框架,核心思路是:在隔离环境(如 Docker 容器)中部署角色,再用验证工具检查结果是否符合预期。它不替代单元测试,而是做集成级验证——确保角色在真实目标系统上能正确安装、配置、启动服务并满足安全或状态要求。
初始化角色并创建默认测试场景
如果你已有角色目录(例如 my-nginx-role),进入该目录后运行:
molecule init scenario -r my-nginx-role
这会生成 molecule/default/ 目录及关键文件:molecule.yml(主配置)、converge.yml(调用角色的 playbook)、verify.yml(验证逻辑)。Molecule 默认使用 Docker 驱动,所以无需额外装虚拟机软件。
配置测试目标平台与执行用户
打开 molecule/default/molecule.yml,重点修改 platforms 和 provisioner 部分:
- 指定多个操作系统镜像,例如同时测 Ubuntu 22.04 和 CentOS 8:
platforms:
- name: ubuntu2204
image: ubuntu:22.04
- name: centos8
image: quay.io/centos/centos:8- 若角色需以非 root 用户运行(如加固类角色),在 provisioner.inventory.host_vars 中为每个平台设 ansible_user,并确保对应容器镜像中该用户存在且有 sudo 权限;
- 在角色的 tasks/main.yml 中,涉及特权操作(如写入 /etc 或创建系统服务)的任务,要显式声明 become: true。
编写验证逻辑(用 Testinfra 或 Ansible)
Molecule 默认验证器已从 Testinfra 切换为 Ansible(v4+),但你仍可手动启用 Testinfra。两种方式都有效:
- 用 Ansible 验证:编辑 molecule/default/verify.yml,写标准的 Ansible 任务,比如检查端口监听、服务状态、文件内容:
- name: Verify nginx is running
ansible.builtin.systemd:
name: nginx
state: started
enabled: true- 用 Testinfra(Python):需在 molecule.yml 中启用,并在 molecule/default/tests/test_default.py 中写断言,例如:
def test_nginx_is_installed(host):
assert host.package("nginx").is_installedTestinfra 更适合细粒度断言(如配置文件某行是否含特定字符串),而 Ansible 验证更轻量、无需额外依赖。
运行完整测试流程
在角色根目录下执行一条命令即可完成“准备→部署→验证→清理”全流程:
molecule test
常用调试组合:
- molecule converge:只执行部署(跳过验证),便于快速调试 playbook 逻辑;
- molecule verify:只运行验证阶段,确认修改后的检查项是否通过;
- molecule destroy:强制删除所有已创建容器,避免残留影响下次测试;
- 加 --debug 参数(如 molecule --debug converge)可查看详细执行日志,定位权限、路径或模块报错。
不复杂但容易忽略











