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 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。
相关推荐
小梁不秃捏24 分钟前
HTTP 常见状态码技术解析(应用层)
网络·网络协议·计算机网络·http
网安加云课堂27 分钟前
课程分享 | 安全系统建设的挑战与解决方案
网络·安全·web安全
learning-striving1 小时前
eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
网络·计算机网络·华为·路由器·ensp·交换机
黑客Ela2 小时前
网络安全营运周报
网络·安全·web安全
挣扎与觉醒中的技术人2 小时前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全
技术小齐2 小时前
网络运维学习笔记 017HCIA-Datacom综合实验01
运维·网络·学习
元气满满的热码式3 小时前
logstash中的input插件(http插件,graphite插件)
网络·网络协议·http·elasticsearch·云原生
风123456789~4 小时前
【爬虫基础】第一部分 网络通讯-编程 P3/3
网络·爬虫
likeyou~coucou5 小时前
自动化之ansible(二)
运维·自动化·ansible
明阳mark5 小时前
Ansible 学习笔记
笔记·学习·ansible