我如何知道某项任务运行的原因?

我如何知道某项任务运行的原因?

我正在使用一个复杂的 Ansible 系统,该系统在各种存储库中有很多角色。当我运行某个剧本时,一个我认为不应该运行的任务正在运行。有没有办法找出触发它的原因?

答案1

Ansible 目前不提供任何工具来可视化任务和角色依赖树。

但你可以做的是

  1. --list-tasks使用来自 的选项获取任务列表ansible-playbook
  2. 按出现顺序考虑顶级剧本中的任务列表,并在列表中标记这些顶级任务。
  3. 确定您感兴趣的任务出现在标记的任务之间的什么位置。
  4. 制作一个剧本,其中仅包含您感兴趣的任务下方直接出现的标记任务。
  5. 重复1此过程5直到恢复角色和任务依赖关系的路径。

例子

这个描述太笼统,因此这里是一个从真实站点中取的例子。

ansible-playbook --list-tasks site.yml

输出约 900 行。剧本包含多个剧本,我们感兴趣的是适用于特定主机组的剧本computeservers

剧情可能像这样:

- hosts:
    - computeservers
  roles: 
    - basic-pkg
    - ntp
    - zabbix
    - slurm
    - jupyter
    - gitlab-ci

假设我们想知道为什么该任务Install compilers在这组节点上运行。

假设我们知道(使用grep)此任务属于名为的角色compilers。我们看到compilers不在顶级角色列表中,因此它位于依赖关系树的某个位置。

在任务列表中,我们寻找以以下内容开头的剧本

  play #2 (computeservers): nodes   TAGS: []
    tasks:
       basic-pkg : task1
       basic-pkg : task2
       ...
       slurm : task1
       slurm : task2
       ...
       compilers : Install compilers
       ...
       jupyter : task1
       ...

因此,我们看到我们感兴趣的任务Install compilers介于顶级角色slurm和之间jupyter。因此,我们需要进一步调查该jupyter角色。

jupyter角色可能具有依赖性

dependencies:
  - scipy

最终,您将恢复角色依赖关系树中指向相关任务的路径。在我们的示例中,这将是

jupyter -> scipy -> anaconda -> compilers -> Install compilers

答案2

Ansible 默认按列出的顺序运行所有任务。执行您未预料到的任务意味着存在一些条件。通常是:表达式、处理程序或包含。

您需要像调试软件一样调试它。找到最简单的测试用例。打印出状态,例如使用调试模块。如需更具体的建议,请发布您的(已过滤敏感信息的)剧本和角色。

相关内容