目录
- [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 在远程主机上执行命令时,会经历以下步骤:
- 使用
scp
传输模块脚本到远程主机。 - 使用
ssh
执行该模块脚本。 - 删除该模块脚本。
每个步骤都会启动一个新的 SSH 连接,这会带来一定的开销和延迟。Pipelining 技术通过将这些步骤合并到一个 SSH 连接中执行,从而减少了 SSH 连接的次数和开销。
如何启用 Pipelining
在 Ansible 配置文件(ansible.cfg
)中,可以通过设置 pipelining
选项来启用 Pipelining。以下是具体的配置步骤:
- 打开或创建
ansible.cfg
文件。 - 在
[defaults]
部分添加或修改pipelining
选项。
ini
[defaults]
pipelining = True
Pipelining 的影响
优点
- 减少 SSH 连接次数:Pipelining 将多个 SSH 连接合并为一个,从而减少了连接开销。
- 提高执行速度:减少网络延迟,提高 Playbook 的整体执行速度,尤其是在处理大量任务时效果显著。
- 降低网络负载:减少了由于频繁 SSH 连接而带来的网络负载。
缺点
- 可能带来安全问题:由于合并了操作步骤,某些情况下可能会暴露更多的命令行参数或环境变量,带来安全隐患。
- 兼容性问题 :某些环境(如需要
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 和其他自动化工具会遇到以下问题:
- 无法非交互式执行命令 :自动化任务(如 Ansible Playbook)在没有 TTY 终端的情况下执行
sudo
命令会失败。 - 阻碍任务自动化:需要人为干预,无法实现完全自动化。
禁用 requiretty 的方法
-
在
/etc/sudoers
文件中禁用requiretty
:修改目标主机的
/etc/sudoers
文件,注释掉或删除Defaults requiretty
行。plaintext# Defaults requiretty
-
为特定用户禁用
requiretty
:如果你不想全局禁用
requiretty
,可以为特定用户禁用它。例如,为ansible
用户禁用
requiretty
:plaintextDefaults:ansible !requiretty
-
在 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 会加载目标用户的登录配置文件和环境变量,确保命令在与用户交互登录时相同的环境中运行,这进一步增强了命令执行的安全性和一致性。