drpsychick.ansible_testing
Ansible 测试
创建完全功能的 SystemD Docker 容器,可用于测试您的 Ansible 角色。
使用 libvirt
,您还可以自动提供 Windows 虚拟机来通过 WinRM
测试您的角色。
旨在在安装了 Docker(可选安装 libvirt)的 Linux 服务器上本地运行。
配置
请查看 defaults/main.yml,了解如何定义容器并根据需要进行调整。
- 定义您自己的
work_dir
。内容是临时的,将在destroy
时删除! - 定义您想要启动的容器。
简要介绍
这个角色包含 create
和 destroy
任务,用于容器和虚拟机。它循环遍历配置的列表(vars.yml
中的 containers
或 virtual_machines
),并相应地创建实例。
每个 Molecule 场景只能使用容器 或 虚拟机,因为 Molecule 每个场景只支持一个驱动程序。
Linux: 它创建具有特权的 Docker 容器,使用 /sbin/init
启动,以拥有一个完全支持 SystemD 的实例。
Windows: 它创建虚拟机(无人值守安装的 Windows),并在第一次启动时为 Ansible 配置 WinRM(普通 HTTP)。
提示: 创建 Windows 虚拟机成本高,需时超过 10 分钟。
贡献
如果您有其他系统想要测试,请随时提供一个 PR,附加 Dockerfile 或 libvirt 配置。
贡献非常简单:
- 在 GitHub 上分叉项目:https://github.com/DrPsychick/ansible-testing
- 在您的 Linux 机器上检查分叉
- 在您的角色 Molecule 场景中创建符号链接(即
./molecule/default/
) - 进行更改并使用它们测试您的角色,直到您满意 - 提交并创建一个拉取请求
- 您可以使用
act
在本地运行 GitHub Actions 以获得快速反馈:https://nektosact.com/installation/index.html
GitHubName=YourName
YourRoleDir=/这是/您的/角色/目录/MyRole
YourRoleName=MyRole
WhereYourForkIs=/这是/您/克隆/您的/分叉的地方
# 克隆您的分叉
cd $WhereYourForkIs
git clone https://github.com/$GitHubName/ansible-testing.git
# 在您的 Molecule 场景中创建符号链接
cd $YourRoleDir/molecule/default
ln -s $WhereYourForkIs/ansible-testing drpsychick.ansible_testing
# 注释掉 requirements 中的角色并删除下载的版本
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$YourRoleName/default/roles/drpsychick.ansible_testing
现在,当您运行 molecule
时,将使用符号链接来包含 drpsychick.ansible_testing
角色。
进行更改,定期提交,完成后,别忘了创建一个拉取请求,以便其他人也能受益于您的改进。同时,您还可以通过 Molecule 测试角色:
只需在您的本地分叉目录中执行 molecule test
。
使用
要求:
- Linux(因为它以
privileged
模式生成容器,并绑定/sys/fs/cgroup
) - Docker
- libvirt(用于 Windows 虚拟机)
使用 Docker 容器进行测试(Linux)
要求:
pip3 install -U molecule molecule-docker
使用 Ansible molecule
使用 molecule init role <name>
创建新角色,或在现有角色目录中使用 molecule init scenario default
初始化 Molecule 场景。
从此仓库下载使用此角色的示例文件(在 create
和 destroy
中):
for f in create destroy molecule requirements vars; do
curl -o molecule/default/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/default/$f.yml
done
调整 molecule/default/vars.yml
以定义要提供的容器。
然后相应地调整 molecule/default/molecule.yml
中的 platforms
。
vars.yml
work_dir: "/tmp/ansible-testrole-default"
containers:
- { name: fedora40, os: fedora, dockerfile: Dockerfile_Fedora, files: ["entrypoint.sh"], args: { VERSION: 40 } }
- { name: ubuntu2404, os: ubuntu, dockerfile: Dockerfile_Ubuntu, files: ["entrypoint.sh"], args: { VERSION: 24.04 } }
- { name: centos7, os: centos, dockerfile: Dockerfile_CentOS, files: ["entrypoint.sh"], args: { VERSION: 7 } }
molecule.yml
[...]
platforms:
- name: fedora40
- name: ubuntu2404
- name: centos7
[...]
运行 molecule
# 分别执行步骤
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy
# 或者一次性运行所有
molecule test
独立模式
编写您自己的剧本或使用 tests
中的剧本
ansible-galaxy install -r requirements.yml
# 根据需要编辑 tests/provision.yml
echo "[defaults]
roles_path = .." > ansible.cfg
# 创建容器
ansible-playbook tests/create.yml
# 销毁容器
ansible-playbook tests/destroy.yml
使用 Windows 虚拟机进行测试
要求:
- 安装
libvirt
、libvirt-clients
、virtinst
- ansible-galaxy
community.libvirt
- 让 Ansible 连接 WinRM:
python3-winrm
- 查看 defaults/main.yml
- 下载您选择的 Windows 映像(测试为 Windows 2016 设置)
- 下载 VirtIO ISO
- 将两个 ISO 放入
libvirt_iso_dir
# 下载 ISO 文件
sudo curl -Lo /var/lib/libvirt/isos/WindowsServer2016.iso http://care.dlservice.microsoft.com/dl/download/1/6/F/16FA20E6-4662-482A-920B-1A45CF5AAE3C/14393.0.160715-1616.RS1_RELEASE_SERVER_EVAL_X64FRE_EN-US.ISO
sudo curl -Lo /var/lib/libvirt/isos/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
以用户身份使用 libvirt(无提权/ sudo)
创建可供用户写入的 image
和 iso
池,并相应设置池的权限。
确保用户属于:
sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # 设置权限
sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # 设置权限
在 molecule/libvirt/vars.yml
中引用目录和池
libvirt_image_dir: "/mydir/libvirt/images"
libvirt_iso_dir: "/mydir/libvirt/isos"
libvirt_disk_pool: "myimages"
使用 Ansible molecule
使用 molecule init role <name>
创建新角色,或在现有角色目录中使用 molecule init scenario default
初始化 Molecule 场景。
从此仓库下载使用此角色的示例文件(在 create
和 destroy
中):
for f in create destroy molecule requirements vars; do
curl -o molecule/libvirt/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/libvirt/$f.yml
done
调整 molecule/libvirt/vars.yml
以定义要提供的容器。
然后相应地调整 molecule/libvirt/molecule.yml
中的 platforms
。
# 运行场景 "libvirt"
molecule test -s libvirt
独立模式
ansible-galaxy install -r requirements.yml
# 根据需要编辑 tests/provision.yml
echo "[defaults]
roles_path = .." > ansible.cfg
# 创建虚拟机
ansible-playbook tests/create_vm.yml
# 销毁虚拟机
ansible-playbook tests/destroy_vm.yml
使用预定义的 Windows 映像加快提供速度
一次完整的启动(创建)两台 Windows 实例,使用预定义映像耗时 少于 4 分钟,我的 i7 可以做到。
- 创建一个
qcow2
映像,或仅使用无人值守安装一次提供虚拟机 - 从准备好的虚拟机创建 ZIP:
zip windows2016-clean.qcow2.zip windows2016.qcow2
(文件名必须匹配,并位于 ZIP 文件根目录中 - 不带路径) - 将 ZIP 文件移动到
libvirt_iso_dir
或通过 URL 提供(disk_image_url
)
使用不同的 Ansible 版本进行本地测试
需要 python3-venv
# 版本 16 和最新版本会失败
# ERROR! Unexpected Exception, this is probably a bug: cannot import name 'should_retry_error' from 'ansible.galaxy.api'
ANSIBLE_VERSION=15
python3 -m venv .venv
. .venv/bin/activate
pip3 install --upgrade pip setuptools wheel
pip3 install --requirement requirements-ansible_${ANSIBLE_VERSION}.txt
molecule test