跳至内容

Molecule 快速入门

本指南将逐步演示开发和测试新的 Ansible 集合的示例。阅读本指南后,您应该熟悉如何使用 Molecule 及其功能。

  1. 创建集合

    创建集合的一种推荐方法是将其放在 `collections/ansible_collections` 目录下。如果您不将集合放在名为 `ansible_collections` 的目录中,_Molecule 将无法找到您的角色_。

      ansible-galaxy collection init foo.bar
    
  2. 切换到新集合的 `roles` 目录。

  3. 为该集合初始化一个新角色。

      ansible-galaxy role init my_role
    
  4. 在 `my_role/tasks/main.yml` 下添加一个任务。

    ---
    - name: Task is running from within the role
      ansible.builtin.debug:
        msg: "This is a task from my_role."
    
  5. 在新集合的根目录下,创建一个名为 `playbooks` 的目录。

  6. 切换到 `playbooks` 目录并创建一个名为 `my_playbook.yml` 的新剧本。

    ---
    - name: Test new role from within this playbook
      hosts: localhost
      gather_facts: false
      tasks:
        - name: Testing role
          ansible.builtin.include_role:
            name: foo.bar.my_role
            tasks_from: main.yml
    
  7. 向集合添加 Molecule

    1. 在您的集合中创建一个名为 `extensions` 的新目录。

    2. 切换到 `extensions` 目录并初始化一个新的默认 Molecule 场景。

         molecule init scenario
      

Collection Structure and ansible config file collections path

在开始测试剧本或角色之前,以下部分提供了与场景相关的的信息。

Molecule 场景

场景是 Molecule 提供许多强大功能的起点。目前,我们可以将场景视为集合中角色或剧本的测试套件。您可以根据需要创建任意数量的场景,Molecule 将按顺序运行它们。

场景布局

在 `molecule/default` 文件夹中,我们找到几个文件和目录

$ ls
create.yml  destroy.yml  molecule.yml  converge.yml
  • `create.yml` 是一个用于创建实例并将数据存储在 instance-config 中的剧本文件。
  • `destroy.yml` 包含用于销毁实例并将其从 instance-config 中删除的 Ansible 代码。
  • `molecule.yml` 是每个场景的 Molecule 中心配置入口点。使用此文件,您可以配置 Molecule 在测试角色时将使用的每个工具。
  • `converge.yml` 是包含角色调用的剧本文件。Molecule 将使用 `ansible-playbook` 调用此剧本并将其针对驱动程序创建的实例运行。

注意

如果 `verify.yml` 剧本没有显式 `include_role` 您的角色,则默认情况下,您的角色提供的 `library` 和 `module_utils` 在剧本中不可用。如果您需要这些用于测试,但又想避免重新运行您的角色,请考虑向您的角色添加一个空任务文件 `init.yml` 并使用 `tasks_from` 将您的角色包含在 `verify.yml` 剧本中。

- name: Verify
  hosts: all
  become: true
  tasks:
    - name: Initialize role without actually running it
      ansible.builtin.include_role:
        name: my_role
        tasks_from: init

# Start testing: can use role library now

检查 `molecule.yml`

`molecule.yml` 用于配置 Molecule。这是一个 YAML 文件,其键表示 Molecule 提供的高级组件。这些是:

  • 依赖项 管理器。Molecule 默认使用 Galaxy 开发指南 来解析您的角色依赖项。
  • 驱动程序 提供程序。Molecule 默认使用 委托 驱动程序。Molecule 使用驱动程序来委托创建实例的任务。
  • 平台 定义。Molecule 依靠它来知道要创建哪些实例、名称以及每个实例属于哪个组。如果您需要针对多个流行发行版(CentOS、Fedora、Debian)测试您的角色,您可以在此部分指定。
  • 供应程序。Molecule 只提供 Ansible 供应程序。Ansible 基于此配置管理实例的生命周期。
  • 场景 定义。Molecule 依靠此配置来控制场景序列顺序。
  • 验证器 框架。Molecule 默认使用 Ansible 来提供一种在目标实例上编写特定状态检查测试(例如部署冒烟测试)的方法。

运行完整的测试序列

Molecule 提供用于手动管理实例、场景、开发和测试工具生命周期的命令。但是,我们也可以告诉 Molecule 在场景序列中自动管理它。

切换到 `extensions` 目录。

可以使用以下命令调用完整的生命周期序列:

molecule test
Molecule full lifecycle sequence
└── default
    ├── dependency
    ├── cleanup
    ├── destroy
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    ├── cleanup
    └── destroy

注意

调用 `molecule test` 时,传递 `--destroy=never` 标志特别有用,这样您可以告诉 Molecule 运行完整的序列,但如果某一步失败则不销毁实例。

如果在调用 `molecule test` 时传递 `--platform-name=[PLATFORM_NAME]` 标志或公开环境变量 `MOLECULE_PLATFORM_NAME`,它可以告诉 Molecule 只在一个平台上运行测试。如果您想测试一个平台的 Docker 镜像,这将很有用。

测试集合剧本或角色

因此,您现在拥有一个隔离的测试环境,也可以通过运行 `molecule converge` 来将其用于实时开发。它将运行与上述相同的步骤,但会在 `converge` 操作后停止。然后,您可以更改您的集合或 Converge 剧本,然后再次运行 molecule converge(一次又一次),直到完成您的开发工作。

初始化的一部分创建的默认文件之一是 `converge.yml` 文件。此文件是一个从头到尾运行角色的剧本。如果需要,可以修改它,但如果您以前从未使用过 Molecule,这是一个良好的起点。

要测试剧本,我们更新 `converge.yml`

---
- name: Include a playbook from a collection
  ansible.builtin.import_playbook: foo.bar.my_playbook

同样,如果我们只想测试 `converge.yml` 文件中的角色而不是剧本

---
- name: Include a role from a collection
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Testing role
      ansible.builtin.include_role:
        name: foo.bar.my_role
        tasks_from: main.yml

切换到 `extensions` 目录。

molecule converge

以上命令运行与 `default` 场景的 `molecule test` 相同的步骤,但会在 `converge` 操作后停止。