Ansible执行完后一堆ssh进程没自动关闭怎么办?

文章导读
这种情况通常是 SSH 控制持久化(ControlPersist)配置导致的,建议先检查 ansible.cfg 中的 ssh_args 设置。
📋 目录
  1. A 紧急清理堆积进程
  2. B 定位配置文件路径
  3. C 修改 SSH 持久化配置
  4. D 验证配置是否生效
  5. E 常见风险与注意事项
  6. F 参考来源
A A

这种情况通常是 SSH 控制持久化(ControlPersist)配置导致的,建议先检查 ansible.cfg 中的 ssh_args 设置。

核心原因:大部分是因为开启了 SSH 连接复用但超时时间设置过长,导致主连接进程常驻。

  • 适合:Ansible 控制节点上出现大量 ssh 进程堆积的场景
  • 先处理:手动清理僵死进程并调整 ControlPersist 超时参数
  • 再验证:运行 playbook 后观察进程数量是否自动回落

紧急清理堆积进程

如果你需要立刻清理当前堆积的进程,可以使用以下命令查找并终止相关的 SSH 进程。请注意区分哪些是 Ansible 创建的,避免误杀其他正在使用的 SSH 会话。

ps -ef | grep ssh | grep ansible

确认进程后,优先使用温和信号终止:

kill -15 <PID>

若进程无响应,再考虑强制终止:

Ansible执行完后一堆ssh进程没自动关闭怎么办?
kill -9 <PID>

定位配置文件路径

Ansible 会读取多个位置的配置文件,确保你修改的是当前生效的那一个。可以通过以下命令查看当前加载的配置文件路径:

ansible `--version`

输出中会显示 config file = /path/to/ansible.cfg。也可以使用以下命令查看完整生效配置:

ansible-config view | grep -i ssh_args

修改 SSH 持久化配置

1. 备份当前配置文件。找到你的 ansible.cfg 文件,通常位于当前目录或/etc/ansible/目录下。

2. 修改 SSH 参数。在 [defaults] 段落下,找到或添加 ssh_args 配置。建议将 ControlPersist 设置为一个合理的时间,例如 60 秒:

[defaults]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s

3. 临时测试方案。如果不希望立即修改配置文件,可以通过环境变量临时测试配置是否生效:

Ansible执行完后一堆ssh进程没自动关闭怎么办?
export ANSIBLE_SSH_ARGS="-o ControlPersist=60s"
ansible all -m ping

4. 如果你不需要连接复用,也可以直接关闭它,但这会降低多次任务执行的速度:

ssh_args = -o ControlMaster=no

5. 清理现有进程。修改配置后,旧的进程不会立刻消失,需要手动清理一次之前残留的 ssh 进程。

验证配置是否生效

1. 记录当前 SSH 进程数量:

ps -ef | grep ssh | grep -v grep | wc -l

2. 执行一次简单的 Ansible 任务,例如 ping 所有主机:

Ansible执行完后一堆ssh进程没自动关闭怎么办?
ansible all -m ping

3. 任务结束后等待设定的超时时间(如 60 秒),再次检查进程数量。如果配置生效,进程数应该在超时后回落到基线水平,而不是一直累积。

常见风险与注意事项

1. 误杀活跃会话:在使用 kill 命令清理进程时,务必确认 PID 属于 Ansible 创建的临时连接,不要杀掉你自己正在使用的 SSH 终端会话。

2. 超时设置过短:如果把 ControlPersist 设得太短(比如 1 秒),虽然进程清理得快,但每次任务都会重新建立 SSH 握手,会明显增加 playbook 的总执行时间。

3. 配置文件优先级:Ansible 会读取多个位置的配置文件,确保你修改的是当前生效的那一个,可以使用 ansible-config view 确认。

参考来源

  • Ansible 官方文档 - Configuration Settings: https://docs.ansible.com/ansible/latest/reference_appendices/config.html
  • Ansible 官方文档 - SSH Connection Plugin: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/ssh_connection.html