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 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。
相关推荐
leoFY12311 小时前
STM32H750配置LAN PHY芯片LAN8742
网络·stm32·嵌入式硬件
阿部多瑞 ABU11 小时前
AI红队攻防演化史(2023-2026):从虚拟角色到RLHF劫持——所有攻击方法全景总结与最新趋势分析
网络·人工智能·安全
博客-小覃12 小时前
Zabbix之华为交换机的日志记录信息操作详细教程
服务器·网络·华为·zabbix
stolentime12 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
ytdbc13 小时前
OSPF综合实验
网络
kaisun6414 小时前
Docker 构建网络问题排查
网络·docker·eureka
雪度娃娃14 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG202415 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam05112315 小时前
OSPF综合实验
网络
QQ154018285615 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片