如何使用Molecule for Ansible测试安装和卸载方案?

时间:2019-05-23 13:51:09

标签: ansible vagrant molecule

在我正在创建的Ansible角色中,我同时介绍了安装和卸载方案:

    foo-install.yml标志设置为main.yml时,从install调用
  • true
  • foo-uninstall.yml标志设置为main.yml时,从install调用
  • false

虽然安装包括安装RPM软件包,复制配置文件和启动系统服务,但卸载步骤基本上是相反的安装:停止系统服务,卸载RPM软件包,删除应用程序文件夹。

作为一个好公民,我使用Molecule创建了一个角色测试,该测试在CentOS Vagrant框中运行该角色。这对于安装场景非常有用,在该场景中,我使用Python测试(使用testinfra)来验证RPM已安装,服务已启动等。

我现在如何也可以使用Molecule测试卸载方案?有没有办法改变Molecule的步骤(例如简化操作)?

  • 创建
  • 融合(运行角色的安装部分)
  • 幂等(对于安装部分)
  • 验证(安装步骤)
  • 收敛(运行角色的卸载部分)
  • 幂等(对于卸载部分)
  • 验证(卸载步骤)
  • 破坏

也许我缺少了一些东西,但是我还没有找到一种明显的方法(或示例)来做这样的事情。

有没有办法掩盖这种情况?还是只测试安装方案会更好?

1 个答案:

答案 0 :(得分:1)

推荐的解决方案

解决此问题的推荐方法是使用多个Molecule Scenarios。您可以将install方案用作默认方案,然后添加第二个uninstall方案,该方案仅运行并测试卸载步骤。

进行此设置时,只需在角色的molecule文件夹中创建第二个脚本目录(复制default文件夹),然后进行一些更改:

  • molecule.yml文件中,将scenario.name属性更改为uninstall
  • 在同一文件中,使用default场景的playbook.yml文件作为prepare步骤的剧本:

    provisioner:
      name: ansible
      playbooks:
        prepare: ../default/playbook.yml
        converge: playbook.yml
    
  • 调整uninstall方案的测试以验证卸载步骤。

这将确保安装软件的步骤与安装/默认方案中的步骤相同,并且您可以专注于卸载步骤。

要运行方案,可以运行所有方案,也可以运行一个方案:

# Run all scenarios
molecule test --all

# Run only the uninstall scenario
molecule test --scenario-name uninstall

这应该使您非常接近要执行的操作,而无需复制任何代码。

如果您想尝试其他一些事情,这里还有其他一些想法:

替代项

我将只保留一个用于安装的方案,该方案将进行所有必要的测试(棉绒,幂等,检查,验证...。)并创建一个install_uninstall特定方案。

install_uninstall绝不是幂等的。因此,此方案应禁用永远不会通过的幂等性测试。您可能还想禁用在其他情况下进行的检查测试,皮棉...这可以在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.

不幸的是,除非此功能是最近才添加到分子中的,否则无法使用额外的变量调用idempotencycheck