【发布时间】:2022-01-16 02:05:13
【问题描述】:
问题
我们有一个在 v5.0.0 上运行的 Ansible AWX 实例已经运行了一年多,但突然所有作业都停止工作 - 没有呈现输出。它们将开始“运行”,但会无限期挂起,而不会打印出任何日志记录。
AWX 实例在此处定义的 docker compose 容器设置中运行:https://github.com/ansible/awx/blob/5.0.0/INSTALL.md#docker-compose
观察
标准故障排除(例如重新启动容器、主机操作系统等)没有帮助。两种环境都没有配置更改。
在调试实际的 playbook 命令时,我们观察到从 UI 运行 playbook 的命令如下所示:
ssh-agent sh -c ssh-add /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_data && rm -f /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_data && ansible-playbook -vvvvv -u ubuntu --become --ask-vault-pass -i /tmp/awx_11021_0fmwm5uz/tmppo7rcdqn -e @/tmp/awx_11021_0fmwm5uz/env/extravars playbook.yml
依次分解为三个命令:
ssh-agent sh -c ssh-add /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_datarm -f /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_dataansible-playbook -vvvvv -u ubuntu --become --ask-vault-pass -i /tmp/awx_11021_0fmwm5uz/tmppo7rcdqn -e @/tmp/awx_11021_0fmwm5uz/env/extravars playbook.yml
您可以在第 3 部分中看到,-vvvvv 是调试参数——但是,挂起发生在命令 #1 上。这与 ansible 或 AWX 无关,但它不会为我们提供太多调试信息。
我尝试通过strace 来查看发生了什么,但由于下面给出的原因,很难了解它实际挂起的内容。如果可能有帮助,我可以提供此输出。
分析
那么命令 #1 的一个自然问题是 'ssh_key_data' 是什么?
这就是我们在 AWX 中设置的机器凭证(一个 SSH 密钥)——它已经有一段时间没有改变了,在直接 SSH 命令中使用时它工作得很好。它显然也被 AWX 设置为文件管道:
prw------- 1 root root 0 Dec 10 08:29 ssh_key_data
这开始解释为什么它可能会挂起(如果没有从管道的另一端读入)。
从命令行运行一个普通的 ansible-playbook(并以更正常的方式提供 SSH 密钥)工作得很好,所以我们仍然可以部署,但现在只能通过 CLI —— 只是 AWX 坏了。
结论
那么问题就变成了“为什么是现在”?以及“如何调试”?我检查了 awx_postgres 的运行状况,并确认机器凭据确实以预期的格式存在(在 main_credential 表中)。我还验证了可以在 awx_task 容器上使用 ssh-agent 而无需使用该管道密钥文件。因此,问题似乎确实是这个管道文件 - 但我无法从任何日志中收集管道另一端(发送者)应该是什么,或者他们为什么不发送数据.
【问题讨论】:
-
一些搜索表明管道的另一端由this code 写入,并且使用管道的目的是防止解密的密钥接触磁盘。同样,ssh-agent 用于将密钥保存在内存中。
-
确实,再往下看,管道写入似乎是在 ansible-runner 中完成的,这里:github.com/ansible/ansible-runner/blob/1.3.4/ansible_runner/…
-
即使在最新版本的 ansible-runner (v2.1.1) 中,
open_fifo_write():的代码也是相同的 -
您的工作ID号最近是否超过10000?也许你遇到了这个错误:github.com/ansible/awx/issues/10489
-
澄清一下,目前只有剧本作业失败。库存同步作业仍在工作。但是最后一个成功的 playbook 作业 ID 是 10987,这太疯狂了(所有 playbook 都以作业 ID 10993 开始失败)。这非常接近报告的幻数,并且阅读 cmets,似乎没有关于触发条件的数字 10000 的具体内容(有些提供的数字相互冲突)。特别是此评论描述了我的问题中的 exact 症状:github.com/ansible/awx/issues/10489#issuecomment-930118691
标签: linux docker ssh ansible ansible-awx