AWX 所有作业都停止处理并无限期挂起——为什么

AWX all jobs stop processing and hang indefinitely -- why

问题

我们已经在 v5.0.0 上运行了一个可用的 Ansible AWX 实例 运行 一年多了,突然间所有的作业都停止了——没有输出被渲染。他们将开始“运行ning”,但会无限期挂起而不会打印出任何日志记录。

AWX 实例运行正在 docker 组合容器设置中,定义如下:https://github.com/ansible/awx/blob/5.0.0/INSTALL.md#docker-compose

观察

重新启动容器、主机 OS 等标准故障排除没有帮助。两种环境中的配置都没有变化。

在调试一个实际的剧本命令时,我们观察到从 UI 到 运行 剧本的命令如下所示:

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

按顺序分为三个命令:

  1. ssh-agent sh -c ssh-add /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_data
  2. rm -f /tmp/awx_11021_0fmwm5uz/artifacts/11021/ssh_key_data
  3. ansible-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 table 中)。我还验证了可以在 awx_task 容器上使用 ssh-agent 而无需使用该管道密钥文件。所以问题似乎真的出在这个管道文件上——但我无法从任何日志中收集到管道另一端(发送方)应该在的地方,或者为什么他们不发送数据.

从本周五开始,在与您相同的时间范围内遇到了同样的问题。原来,Crowdstrike(猎鹰传感器)特工是罪魁祸首。我猜他们推出了一个破坏或阻塞 fifo 管道的定义更新。当我们停止 CS 代理时,AWX 再次开始正常工作,没有任何问题。看看你是不是运行类似的安全产品。

对于 Crowdstrike 的用户,问题可能与您的组织在周末实施的政策变更有关:

crowdstrike 发布了 6.32 版,周末被许多组织采用以应对 log4j 漏洞,其中引入了一些围绕脚本级别检查的更改。

基于脚本的执行监视是中断的罪魁祸首。正如其他用户所说,您可以完全禁用 crowdstrike 并重新启动 AWX 作业以使其正常工作,但出于生产安全考虑,这可能不合适。

相反,您必须联系您的 crowdstrike 管理员,他将更新您的实例配置文件的策略以包括基于脚本的执行监控。策略管理 GUI 有一个复选框,可以 enable/disable 使用此功能(6.32 中的新功能)。要求他们禁用它并将日志发送给供应商。

已确认 Crowdstrike 政策更新是 Ansible Tower 在我们公司停止工作 48 小时的原因。禁用监控选项允许作业几乎立即 运行 成功。

即使容器上的 AWX 运行 我也确认了同样的情况...

关于现有的解决方案,none适合我的情况:

  1. 禁用 Crowdstrike 服务...出于安全原因不可能
  2. 要求禁用“基于脚本的执行监视”我现在的位置会很头疼

所以我修补了 ansible-runner 以避免让 shell/bash(又名基于脚本)读取文件并让 Python 执行它

我使用的是旧版本的 AWX 15.0.1,因此相应的 ansible-runner 可能有点旧。但我检查过主方法仍然存在(但在不同的文件上)

我已经从

def wrap_args_with_ssh_agent(self, args, ssh_key_path, ssh_auth_sock=None, silence_ssh_add=False):
    """
    Given an existing command line and parameterization this will return the same command line wrapped with the
    necessary calls to ``ssh-agent``
    """
    if ssh_key_path:
        ssh_add_command = args2cmdline('ssh-add', ssh_key_path)
    ...

def wrap_args_with_ssh_agent(self, args, ssh_key_path, ssh_auth_sock=None, silence_ssh_add=False):
    """
    Given an existing command line and parameterization this will return the same command line wrapped with the
    necessary calls to ``ssh-agent``
    """
    if ssh_key_path:
        ssh_key_content = ""
        with open(ssh_key_path) as f:
            ssh_key_content = f.read()

        ssh_add_command = 'ssh-add - <<< "' + ssh_key_content + '"'

注意私钥内容会暴露在日志中。只是一个 POC,我认为我们可以做得更好(也许重写其他文件的内容?并使用那个新的克隆)

Crowdstrike 已发布传感器版本 6.32.12905 以解决此问题。在您的环境中配置 Falcon 的任何人都可以 create/modify 传感器更新策略将最新版本推送到受影响的主机。

发行说明: 概括 修补程序版本解决了基于脚本的执行监视的问题,在该问题中,Linux 传感器可能会挂起包含管道文件的命令行。

已修复 解决了基于脚本的执行监控的问题,在该问题中,Linux 传感器可能会挂起包含管道文件

的命令行