drpsychick.ansible_testing

Ansible 测试

构建状态 许可证 Paypal GitHub Sponsor

创建完全功能的 SystemD Docker 容器,可用于测试您的 Ansible 角色。 使用 libvirt,您还可以自动提供 Windows 虚拟机来通过 WinRM 测试您的角色。 旨在在安装了 Docker(可选安装 libvirt)的 Linux 服务器上本地运行。

配置

请查看 defaults/main.yml,了解如何定义容器并根据需要进行调整。

  • 定义您自己的 work_dir。内容是临时的,将在 destroy 时删除!
  • 定义您想要启动的容器。

简要介绍

这个角色包含 createdestroy 任务,用于容器和虚拟机。它循环遍历配置的列表(vars.yml 中的 containersvirtual_machines),并相应地创建实例。 每个 Molecule 场景只能使用容器 虚拟机,因为 Molecule 每个场景只支持一个驱动程序。

Linux: 它创建具有特权的 Docker 容器,使用 /sbin/init 启动,以拥有一个完全支持 SystemD 的实例。

Windows: 它创建虚拟机(无人值守安装的 Windows),并在第一次启动时为 Ansible 配置 WinRM(普通 HTTP)。

提示: 创建 Windows 虚拟机成本高,需时超过 10 分钟。

贡献

如果您有其他系统想要测试,请随时提供一个 PR,附加 Dockerfile 或 libvirt 配置。

贡献非常简单:

  1. 在 GitHub 上分叉项目:https://github.com/DrPsychick/ansible-testing
  2. 在您的 Linux 机器上检查分叉
  3. 在您的角色 Molecule 场景中创建符号链接(即 ./molecule/default/
  4. 进行更改并使用它们测试您的角色,直到您满意 - 提交并创建一个拉取请求
  5. 您可以使用 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 场景。

从此仓库下载使用此角色的示例文件(在 createdestroy 中):

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 虚拟机进行测试

要求:

  • 安装 libvirtlibvirt-clientsvirtinst
  • 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)

创建可供用户写入的 imageiso 池,并相应设置池的权限。 确保用户属于:

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 场景。

从此仓库下载使用此角色的示例文件(在 createdestroy 中):

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 可以做到。

  1. 创建一个 qcow2 映像,或仅使用无人值守安装一次提供虚拟机
  2. 从准备好的虚拟机创建 ZIP:zip windows2016-clean.qcow2.zip windows2016.qcow2 (文件名必须匹配,并位于 ZIP 文件根目录中 - 不带路径)
  3. 将 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
关于项目

role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with

安装
ansible-galaxy install drpsychick.ansible_testing
许可证
mit
下载
1.7k
拥有者
individual, curious, human