Ansible调优之 Pipelining(任务流水线)详解

Ansible 中的 Pipelining(任务流水线)详解

在 Ansible 中,Pipelining 是一种优化技术,旨在减少远程主机上命令执行的开销,从而加快 Playbook 的执行速度。具体来说,Pipelining 可以减少 SSH 连接中的操作步骤,降低网络延迟,提高整体性能。

Pipelining 的工作原理

通常情况下,Ansible 在远程主机上执行命令时,会经历以下步骤:

  1. 使用 scp 传输模块脚本到远程主机。
  2. 使用 ssh 执行该模块脚本。
  3. 删除该模块脚本。

每个步骤都会启动一个新的 SSH 连接,这会带来一定的开销和延迟。Pipelining 技术通过将这些步骤合并到一个 SSH 连接中执行,从而减少了 SSH 连接的次数和开销。

如何启用 Pipelining

在 Ansible 配置文件(ansible.cfg)中,可以通过设置 pipelining 选项来启用 Pipelining。以下是具体的配置步骤:

  1. 打开或创建 ansible.cfg 文件。
  2. [defaults] 部分添加或修改 pipelining 选项。
[defaults]
pipelining = True

Pipelining 的影响

优点

  1. 减少 SSH 连接次数:Pipelining 将多个 SSH 连接合并为一个,从而减少了连接开销。
  2. 提高执行速度:减少网络延迟,提高 Playbook 的整体执行速度,尤其是在处理大量任务时效果显著。
  3. 降低网络负载:减少了由于频繁 SSH 连接而带来的网络负载。

缺点

  1. 可能带来安全问题:由于合并了操作步骤,某些情况下可能会暴露更多的命令行参数或环境变量,带来安全隐患。
  2. 兼容性问题:某些环境(如需要 requiretty 选项的 SSH 服务器配置)可能不支持 Pipelining,需要进行额外配置或禁用该选项。(后面讲解)

使用场景

  • 大规模部署:在大规模集群环境中,Pipelining 可以显著提高 Playbook 执行速度,减少部署时间。
  • 低延迟要求:在对执行速度要求较高的场景中,Pipelining 可以提供更好的性能表现。
  • 频繁任务执行:在频繁执行大量任务的情况下,Pipelining 可以减少 SSH 连接的开销,提高整体效率。

什么是 requiretty?

  • requiretty 是一个 SSH 配置选项,通常位于目标主机的 /etc/sudoers 文件中。这个选项要求所有通过 sudo 执行的命令必须从一个 TTY 终端发起。它的目的是增加安全性,防止某些环境下的非交互式命令执行。

requiretty 的定义及其影响

  • /etc/sudoers 文件中,requiretty 选项的定义如下:
Defaults requiretty

当启用了 requiretty 选项时,只有通过交互式终端(如 SSH 登录会话)才能使用 sudo 执行命令。任何试图通过非交互式方式(如脚本或自动化工具)使用 sudo 的操作都会失败。

启用 requiretty 的影响

启用 requiretty 后,通过 sudo 执行命令时,Ansible 和其他自动化工具会遇到以下问题:

  1. 无法非交互式执行命令:自动化任务(如 Ansible Playbook)在没有 TTY 终端的情况下执行 sudo 命令会失败。
  2. 阻碍任务自动化:需要人为干预,无法实现完全自动化。

禁用 requiretty 的方法

  1. /etc/sudoers 文件中禁用 requiretty
    修改目标主机的 /etc/sudoers 文件,注释掉或删除 Defaults requiretty 行。

    # Defaults requiretty
    
  2. 为特定用户禁用 requiretty
    如果你不想全局禁用 requiretty,可以为特定用户禁用它。例如,为 ansible 用户禁用
    requiretty

    Defaults:ansible !requiretty
    
  3. 在 Ansible Playbook 中指定 sudo 参数
    在 Playbook 中使用 become 相关参数,确保在没有 TTY 的情况下使用 sudo 执行命令。

    - hosts: all
      become: yes
      become_method: sudo
      become_flags: '-i'
      tasks:
        - name: Ensure /opt/abc.txt exists
          file:
            path: /opt/abc.txt
            state: touch
    
  • -i:模拟初始登录,这会加载目标用户的环境变量和配置文件。

为什么 -i 选项可以绕过 requiretty
当使用 sudo -i 执行命令时,sudo 创建了一个新的登录 shell 会话,这与直接通过 SSH 登录主机的交互式 shell 类似。这种环境下,sudo 可以绕过 requiretty 的限制,因为:

  • 登录 Shell 环境:sudo -i 创建了一个新的登录 shell 环境,相当于用户通过 SSH 登录并获得了一个 TTY 会话。由于 requiretty 的主要目的是确保命令在交互式会话中运行,而 sudo -i 已经创建了这样的会话,因此满足了 requiretty 的要求。
  • 环境一致性:sudo -i 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。
  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值