跳到内容

常见问题解答

为什么我的幂等性操作失败了?

重要的是要理解,在确定你的任务是否具有幂等性时,Molecule 除了 Ansible 的默认功能外,没有做任何其他操作。Molecule 将简单地运行两次 converge 操作,并对照 Ansible 的标准输出进行检查。

因此,如果你看到幂等性失败,通常与底层的 Ansible 报告有关,而不是 Molecule。

如果你遇到幂等性失败,并打算在我们的问题跟踪器上提出 bug,请首先手动运行两次 molecule converge,并确认 Ansible 本身报告了任务幂等性 (changed=0)。

为什么 Molecule 会进行这么多的 shell 调用?

Ansible 提供了一个 Python API。但是,它不适用于直接使用。我们希望专注于使 Molecule 有用,因此我们的精力都花在了使用 Ansible 的 CLI 上。

由于我们已经使用了 Ansible 的 CLI,因此我们决定通过各自的 CLI 调用其他二进制文件。

为什么 Molecule 只支持特定的 Ansible 版本?

我们只能针对有限数量的 Ansible 版本进行测试,而且我们经常依赖于仅在最近版本的 Ansible 中修复的错误。

为什么使用 playbook 来配置实例?

简单。Ansible 已经支持众多云提供商。在 Molecule v1 中,花费了太多时间重新实现 Ansible 核心模块中已经存在的功能。

为什么不使用 Ansible 的 Python API 而使用 playbook?

这在早期就进行了评估。这是一个艰难的抉择。在某些情况下,它会提供简单性,而在其他情况下则会提供复杂性。开发人员了解并理解 playbook。最终决定放弃更优雅和更吸引人的解决方案。

为什么会有多个场景目录和 molecule.yml 文件?

再次强调,简单。我们选择规范化,而不是定义一个无所不包的配置文件。Molecule 只是循环遍历每个场景,应用该场景的 molecule.yml。

是否有与 Molecule 类似的工具?

我可以并行运行 Molecule 进程吗?

请参阅parallel-usage-example 以了解用法。

我可以在 molecule.yml 中指定随机实例 ID 吗?

这取决于 CI 提供商,但基本方法如下。

将你的 molecule.yml 设置为如下所示

platforms:
  - name: "instance-${INSTANCE_UUID}"

然后在你的 CI 提供商环境(例如,Gitlab CI)中进行设置

variables:
  INSTANCE_UUID: "$CI_JOB_ID"

其中 CI_JOB_ID 是 Gitlab 提供的随机变量。

Molecule 将在创建和查找实例名称时解析 INSTANCE_UUID 环境变量。你可以通过运行 molecule list 来确认一切正常。

在哪里可以配置我的 roles-pathcollections-paths

从 Molecule v6 开始,用户应使用 ansible.cfg 文件,以便在需要时进行更改。

Molecule 是否支持单体仓库?

是的,包含在单体仓库中的角色与其他角色一起会自动被拾取,并且 ANSIBLE_ROLES_PATH 会相应地设置。有关更多信息,请参见 此页面

如何添加仅用于开发/测试的依赖项?

有时,在用 Molecule 开发角色时,仅运行依赖角色是可取的,但不对角色本身施加硬依赖;例如,当你依赖于它的副作用之一时。这可以通过在角色的 meta/main.yml 中使用如下方法来实现

---
dependencies:
  - role: <your-dependee-role>
    when: lookup('env', 'MOLECULE_FILE')