4

在我创建的 Ansible 角色中,我涵盖了安装和卸载场景:

  • foo-install.ymlmain.ymlinstall标志设置为时调用true
  • foo-uninstall.ymlmain.ymlinstall标志设置为时调用false

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

作为一个好公民,我使用Molecule为角色创建了一个测试,它在 CentOS Vagrant 盒子中运行角色。这适用于安装场景,我使用 Python 测试(使用testinfra)来验证 RPM 是否已安装、服务是否已启动等。

我现在如何使用 Molecule 来测试卸载方案?有没有办法改变分子中的步骤,它做这样的事情(简化)?

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

也许我遗漏了一些东西,但我还没有找到一个明显的方法(或例子)来说明如何做这样的事情。

有没有办法覆盖这样的场景?或者我最好只测试安装场景?

4

1 回答 1

4

推荐解决方案

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

设置时,只需在您的角色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场景的测试以验证卸载步骤。

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

要运行场景,您可以运行所有场景或单个场景:

# 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.

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

于 2019-05-23T16:43:09.480 回答