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

目录

  • [Ansible 中的 Pipelining(任务流水线)详解](#Ansible 中的 Pipelining(任务流水线)详解)
      • [Pipelining 的工作原理](#Pipelining 的工作原理)
      • [如何启用 Pipelining](#如何启用 Pipelining)
      • [Pipelining 的影响](#Pipelining 的影响)
      • 使用场景
  • [什么是 requiretty?](#什么是 requiretty?)
      • [启用 requiretty 的影响](#启用 requiretty 的影响)
      • [禁用 requiretty 的方法](#禁用 requiretty 的方法)

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 选项。
ini 复制代码
[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 选项的定义如下:
plaintext 复制代码
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 行。

    plaintext 复制代码
    # Defaults requiretty
  2. 为特定用户禁用 requiretty

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

    plaintext 复制代码
    Defaults:ansible !requiretty
  3. 在 Ansible Playbook 中指定 sudo 参数

    在 Playbook 中使用 become 相关参数,确保在没有 TTY 的情况下使用 sudo 执行命令。

    yaml 复制代码
    - 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 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。
相关推荐
egekm_sefg24 分钟前
华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数
网络·华为
SONG_YIH2 小时前
5G -- 网络安全
网络·5g·移动通信
maimang0911 小时前
关于UDP缓冲区和丢包统计
网络
tjjingpan11 小时前
HCIA-Access V2.5_4_2_静态路由介绍
网络
这题怎么做?!?12 小时前
ARP协议及其具体过程
运维·服务器·网络
无线认证x英利检测13 小时前
进网许可认证、交换路由设备检测项目更新25年1月起
网络·智能路由器
卡卡大怪兽13 小时前
fastAPI接口的请求与响应——基础
服务器·网络·fastapi
昌sit!13 小时前
监控IP频繁登录服务器脚本
服务器·网络·tcp/ip
代码洁癖症患者13 小时前
HTTP请求的奇幻旅程:从发起至响应的全方位探索
网络·网络协议·http
凹凸撒man14 小时前
AUTOSAR TCP中的MSS和MTU的关系
网络·tcp/ip·autosar