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 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。
相关推荐
一叶飘零_sweeeet8 分钟前
手写 RPC 框架
java·网络·网络协议·rpc
fei_sun7 小时前
【复习】计网每日一题1105大题---ARP、NAT、路由器、IP数据报、冲突域、广播域、100BASE-F、10BASE-T
网络
wearegogog1238 小时前
基于混合蛙跳算法和漏桶算法的无线传感器网络拥塞控制与分簇新方法
网络·算法
希赛网10 小时前
倒计时两天!软考网络工程师案例分析模拟题
网络·网络工程师·软考·案例分析题·考前复习
熙xi.10 小时前
以太网帧格式、IP数据报头部、TCP头部、UDP头部
网络·tcp/ip·udp
盛世宏博智慧档案11 小时前
新生产力算力机房内部温湿度之以太网监控系统方案
运维·服务器·网络·算力·温湿度
星释11 小时前
Rust 练习册 16:Trait 作为返回类型
java·网络·rust
qyresearch_11 小时前
全球生物识别加密U盘市场:安全需求驱动增长,技术迭代重塑格局
网络·安全
wydaicls11 小时前
C语言完成Socket通信
c语言·网络·websocket
light_forest13 小时前
tcp_connect_v4接口
java·网络·tcp/ip