如何通过 pipeline 插件减少 Ansible 远程执行时的 SSH 连接次数

文章导读
在 Ansible 配置文件中开启 pipelining 功能可直接减少每个任务执行时的 SSH 连接次数,适用于大规模服务器部署或模块引用较多的场景。若 Playbook 中使用 sudo 提权,必须先在目标主机禁用 sudoers 中的 requiretty 选项,否则会导致连接失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Ansible 配置文件中开启 pipelining 功能可直接减少每个任务执行时的 SSH 连接次数,适用于大规模服务器部署或模块引用较多的场景。若 Playbook 中使用 sudo 提权,必须先在目标主机禁用 sudoers 中的 requiretty 选项,否则会导致连接失败。

先说结论:开启 pipelining 能合并 SSH 操作步骤,显著缩短执行时间,但需优先解决 sudo 兼容性风险。

  • 先定位:确认目标主机是否启用 sudo 及 requiretty 配置
  • 先做:修改 ansible.cfg 开启 pipelining 并调整 sudoers
  • 再验证:通过 -vvvv 参数观察 SSH 连接次数变化

命令速用版

修改控制端的 ansible.cfg 配置文件,在 [defaults] 或 [ssh_connection] 段落中添加或修改 pipelining 参数。若目标主机使用 sudo,需执行以下命令禁用 requiretty。

# 1. 开启 pipelining (ansible.cfg)
[defaults]
pipelining = True

# 2. 禁用目标主机 requiretty (需 root 权限)
sed -i 's/^Defaults.*requiretty/#Defaults requiretty/' /etc/sudoers

为什么会这样

默认情况下 Ansible 执行每个任务会建立多次 SSH 连接,开启 pipelining 后将合并为一次。

通常 Ansible 在远程主机执行命令经历三个步骤:使用 scp 传输模块脚本到远程主机、使用 ssh 执行该模块脚本、删除该模块脚本,每个步骤都会启动一个新的 SSH 连接。Pipelining 技术通过将这些步骤合并到一个 SSH 连接中执行,利用 stdin 直接传递任务代码,省去了文件传输和删除的过程,从而减少 SSH 连接的次数和开销。

分步处理

按照以下顺序操作,确保配置生效且不影响现有权限管理。

步骤 1:检查目标主机 sudo 配置
登录被控节点,检查 /etc/sudoers 文件。如果存在 Defaults requiretty 配置且 Playbook 中使用 sudo,必须注释掉该行。未禁用该选项直接开启 pipelining 会导致 sudo 命令执行失败。

步骤 2:修改 Ansible 配置文件
在控制机的 ansible.cfg 文件中找到 [defaults] 段落。将 pipelining 参数设置为 True。该参数默认值是 False,大部分 Linux 操作系统默认开启 requiretty 功能,因此 pipelining 默认关闭以保持兼容。

步骤 3:执行 Playbook 测试
运行现有的 Playbook,观察执行过程。在部署大规模服务器或引用模块非常多时,开启该特性会给 Ansible 带来显著的性能提升。

如何通过 pipeline 插件减少 Ansible 远程执行时的 SSH 连接次数

怎么验证是否生效

通过增加 verbose 级别查看底层连接行为。

在命令行添加 -vvvv 参数执行任务:ansible-playbook -vvvv playbook.yml。查看执行结果对比,开启 pipelining 后,单个任务的所有动作都在一个 ssh 会话中完成,会省去 sftp 到远端的过程。如果没有文件传输日志且 SSH 连接建立次数减少,说明配置生效。

常见坑

1. sudo 提权冲突
ssh pipelining 默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果使用 sudo 操作,必须在所有被管理的主机上将配置文件/etc/sudoers 中 requiretty 选项禁用,否则 ssh 远程执行命令时因没有 tty 而无法通过 sudo 验证。

2. 远程主机 Python 依赖
开启 pipelining 后,任务代码通过 stdin 传递,要求远程主机必须存在可用的 Python 解释器。如果目标主机是极简环境且无 Python,该功能可能无法正常工作。

3. 配置文件路径
确保修改的是 Ansible 实际加载的 ansible.cfg 文件。可以通过 ansible `--version` 命令查看当前使用的配置文件路径,避免修改无效配置。

常见问题

pipelining 默认是开启还是关闭?

默认是关闭的。默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项,如果不使用 sudo 建议开启该选项。

开启后对 SSH 连接数具体有什么影响?

打开此选项可以减少 Ansible 执行没有文件传输时 SSH 在被控机器上执行任务的连接数,一个任务的所有动作都在一个 ssh 会话中完成。

不使用 sudo 是否可以安全开启?

可以。如果不使用 sudo,建议开启 ssh pipelining 选项,不会遇到 requiretty 兼容性問題,能明显感受到速度的提升。

参考来源

  • ansible 基础 - 优化
  • Ansible 性能优化
  • Ansible 调优之 Pipelining(任务流水线) 详解
  • Ansible 生产调优与故障排查全攻略
  • Ansible 部署时如何解决目标主机 SSH 连接超时问题?