我正在使用一个复杂的 Ansible 系统,该系统在各种存储库中有很多角色。当我运行某个剧本时,一个我认为不应该运行的任务正在运行。有没有办法找出触发它的原因?
答案1
Ansible 目前不提供任何工具来可视化任务和角色依赖树。
但你可以做的是
--list-tasks
使用来自 的选项获取任务列表ansible-playbook
。- 按出现顺序考虑顶级剧本中的任务列表,并在列表中标记这些顶级任务。
- 确定您感兴趣的任务出现在标记的任务之间的什么位置。
- 制作一个剧本,其中仅包含您感兴趣的任务下方直接出现的标记任务。
- 重复
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 默认按列出的顺序运行所有任务。执行您未预料到的任务意味着存在一些条件。通常是:表达式、处理程序或包含。
您需要像调试软件一样调试它。找到最简单的测试用例。打印出状态,例如使用调试模块。如需更具体的建议,请发布您的(已过滤敏感信息的)剧本和角色。