如何使用 Molecule for Ansible 测试安装和卸载场景?
How to test install and uninstall scenario with Molecule for Ansible?
在我创建的 Ansible 角色中,我涵盖了安装和卸载场景:
当 install
标志设置为 true
. 时,从 main.yml
调用 foo-install.yml
当 install
标志设置为 false
. 时,从 main.yml
调用 foo-uninstall.yml
虽然安装包括安装RPM包、复制配置文件和启动系统服务,但卸载步骤基本上与安装相反:停止系统服务、卸载RPM包、删除应用程序文件夹。
作为一名好公民,我使用 Molecule 创建了一个角色测试,运行 是 CentOS Vagrant 盒子中的角色。这适用于安装场景,我使用 Python 测试(使用 testinfra
)来验证 RPM 已安装、服务已启动等。
现在如何使用 Molecule 来测试卸载场景?有没有办法改变 Molecule 中的步骤,让它做这样的事情(简化)?
- 创建
- converge(运行 角色的安装部分)
- 幂等性(对于安装部分)
- 验证(安装步骤)
- 收敛(运行角色的卸载部分)
- 幂等性(针对卸载部分)
- 验证(卸载步骤)
- 摧毁
也许我遗漏了什么,但我还没有找到一个明显的方法(或示例)来说明如何做这样的事情。
有没有办法覆盖这样的场景?还是我只测试安装场景会更好?
推荐的解决方案
解决此问题的推荐方法是使用多个 Molecule Scenarios。您可以使用 install
场景作为默认场景,然后添加第二个 uninstall
场景,仅 运行s 并测试卸载步骤。
设置时,只需在角色的 molecule
文件夹中创建第二个场景目录(复制 default
一个),然后进行一些更改:
(编辑:这一步对于<3.0的分子是必要的。scenario.name
在以后的版本中被删除了)在molecule.yml
文件将 scenario.name
属性更改为 uninstall
。
在同一文件中,使用 default
场景的 playbook.yml
文件作为 prepare
步骤的剧本:
provisioner:
name: ansible
playbooks:
prepare: ../default/playbook.yml
converge: playbook.yml
调整 uninstall
场景的测试以验证卸载步骤。
这将确保使用与 install/default 场景中相同的步骤安装软件,您可以专注于卸载步骤。
对于 运行 场景,您可以 运行 所有场景或单个场景:
# Run all scenarios
molecule test --all
# Run only the uninstall scenario
molecule test --scenario-name uninstall
这应该让您非常接近您想要做的事情,而无需复制任何代码。
如果你想尝试一些其他的东西,这里有一些其他的想法:
备选方案
我会保留一个仅用于安装的场景,该场景将运行所有需要的测试(lint、幂等性、检查、验证....)并创建一个 install_uninstall
特定场景。
打install_uninstall
永远不会幂等。所以这个场景应该禁用永远不会通过的幂等性测试。您可能还想禁用在其他场景中播放的检查测试,lint...这可以在 molecule.yml
中通过调整 scenario.test_sequence
:
的参数来完成
scenario:
name: install_uninstall
test_sequence:
- destroy
- create
- prepare
- converge
- verify
- destroy
当然你可以根据你的实际需要进行调整(如果你没有针对这种情况的 testinfra 测试,也可以删除验证)。
一旦完成,您只需在场景剧本中添加两个剧本:
---
- name: install
hosts: all
roles:
- role: my_role
install: true
- name: uninstall
hosts: all
roles:
- role: my_role
install: false
您应该准备好测试:
molecule test -s install_uninstall
编辑:
另一种选择是仅保留您当前的安装方案,但启动单个分子命令而不是完整测试。假设你现在的工作场景是default
# Check and lint my files
molecule lint
# Make sure no box/container is on the way
molecule destroy
# Create my box/container for tests
molecule create
# Play my default playbook
molecule converge
# Idempotency check
molecule idempotence
# Verify we can correctly use check mode
molecule check
# Play testinfra tests
molecule verify
# Now play the uninstall
molecule converge -- -e install=false
## add more tests you can think off ##
# and finally cleanup
molecule destroy.
不幸的是,除非此功能是最近才添加到分子中的,否则无法使用额外变量调用 idempotency
和 check
在我创建的 Ansible 角色中,我涵盖了安装和卸载场景:
-
当
foo-install.yml
当install
标志设置为false
. 时,从 foo-uninstall.yml
install
标志设置为 true
. 时,从 main.yml
调用 main.yml
调用 虽然安装包括安装RPM包、复制配置文件和启动系统服务,但卸载步骤基本上与安装相反:停止系统服务、卸载RPM包、删除应用程序文件夹。
作为一名好公民,我使用 Molecule 创建了一个角色测试,运行 是 CentOS Vagrant 盒子中的角色。这适用于安装场景,我使用 Python 测试(使用 testinfra
)来验证 RPM 已安装、服务已启动等。
现在如何使用 Molecule 来测试卸载场景?有没有办法改变 Molecule 中的步骤,让它做这样的事情(简化)?
- 创建
- converge(运行 角色的安装部分)
- 幂等性(对于安装部分)
- 验证(安装步骤)
- 收敛(运行角色的卸载部分)
- 幂等性(针对卸载部分)
- 验证(卸载步骤)
- 摧毁
也许我遗漏了什么,但我还没有找到一个明显的方法(或示例)来说明如何做这样的事情。
有没有办法覆盖这样的场景?还是我只测试安装场景会更好?
推荐的解决方案
解决此问题的推荐方法是使用多个 Molecule Scenarios。您可以使用 install
场景作为默认场景,然后添加第二个 uninstall
场景,仅 运行s 并测试卸载步骤。
设置时,只需在角色的 molecule
文件夹中创建第二个场景目录(复制 default
一个),然后进行一些更改:
(编辑:这一步对于<3.0的分子是必要的。
scenario.name
在以后的版本中被删除了)在。molecule.yml
文件将scenario.name
属性更改为uninstall
在同一文件中,使用
default
场景的playbook.yml
文件作为prepare
步骤的剧本:provisioner: name: ansible playbooks: prepare: ../default/playbook.yml converge: playbook.yml
调整
uninstall
场景的测试以验证卸载步骤。
这将确保使用与 install/default 场景中相同的步骤安装软件,您可以专注于卸载步骤。
对于 运行 场景,您可以 运行 所有场景或单个场景:
# Run all scenarios
molecule test --all
# Run only the uninstall scenario
molecule test --scenario-name uninstall
这应该让您非常接近您想要做的事情,而无需复制任何代码。
如果你想尝试一些其他的东西,这里有一些其他的想法:
备选方案
我会保留一个仅用于安装的场景,该场景将运行所有需要的测试(lint、幂等性、检查、验证....)并创建一个 install_uninstall
特定场景。
打install_uninstall
永远不会幂等。所以这个场景应该禁用永远不会通过的幂等性测试。您可能还想禁用在其他场景中播放的检查测试,lint...这可以在 molecule.yml
中通过调整 scenario.test_sequence
:
scenario:
name: install_uninstall
test_sequence:
- destroy
- create
- prepare
- converge
- verify
- destroy
当然你可以根据你的实际需要进行调整(如果你没有针对这种情况的 testinfra 测试,也可以删除验证)。
一旦完成,您只需在场景剧本中添加两个剧本:
---
- name: install
hosts: all
roles:
- role: my_role
install: true
- name: uninstall
hosts: all
roles:
- role: my_role
install: false
您应该准备好测试:
molecule test -s install_uninstall
编辑:
另一种选择是仅保留您当前的安装方案,但启动单个分子命令而不是完整测试。假设你现在的工作场景是default
# Check and lint my files
molecule lint
# Make sure no box/container is on the way
molecule destroy
# Create my box/container for tests
molecule create
# Play my default playbook
molecule converge
# Idempotency check
molecule idempotence
# Verify we can correctly use check mode
molecule check
# Play testinfra tests
molecule verify
# Now play the uninstall
molecule converge -- -e install=false
## add more tests you can think off ##
# and finally cleanup
molecule destroy.
不幸的是,除非此功能是最近才添加到分子中的,否则无法使用额外变量调用 idempotency
和 check