加速 Ansible

加速 Ansible
众所周知,使用默认设置 Ansible 无法很快完成其工作。 在本文中,我将指出这样做的几个原因,并提供有用的最小设置,这些设置很可能实际上会提高项目的速度。

这里和下面我们讨论 Ansible 2.9.x,它以您最喜欢的方式安装在新创建的 virtualenv 中。

安装后,在你的剧本旁边创建一个“ansible.cfg”文件 - 这个位置将允许你将这些设置与项目一起传输,而且它们会自动加载。

流水线

有些人可能已经听说过需要使用管道,即不将模块复制到目标系统的文件系统,而是将 Base64 包装的 zip 存档直接传输到 Python 解释器的 stdin,但其他人可能没有,但事实仍然是一个事实: 这个设置 仍然被低估。 不幸的是,一些流行的 Linux 发行版默认情况下配置 sudo 的效果不是很好 - 因此该命令需要 tty(终端),因此 Ansible 默认禁用这个非常有用的设置。

pipelining = True

收集事实

您是否知道,在默认设置下,每次播放的 Ansible 都会启动参与其中的所有主机的事实收集? 一般来说,如果您不知道,现在您知道了。 为了防止这种情况发生,您需要启用用于收集事实的显式请求模式(显式)或智能模式。 其中,只会从以前的游戏中没有遇到过的那些主机中收集事实。
UPD。 复印时,您必须选择这些设置之一。

gathering = smart|explicit

重用 ssh 连接

如果您曾经在调试模式下运行 Ansible(“v”选项,重复一到九次),您可能已经注意到 ssh 连接不断建立和断开。 所以,这里也有一些微妙之处。

您可以避免同时在两个级别重新建立 ssh 连接的步骤:直接在 ssh 客户端中以及从管理器将文件传输到托管主机时。
要重用打开的 ssh 连接,只需将必要的密钥传递给 ssh 客户端即可。 然后它会开始做以下事情:当第一次建立ssh连接时,它会额外创建一个所谓的控制套接字,在后续安装时,它会检查这个套接字是否存在,如果成功,则重用该套接字现有的 ssh 连接。 为了使这一切有意义,让我们设置非活动状态下保持连接的时间。 您可以阅读更多内容 ssh 文档,在 Ansible 的上下文中,我们只需使用“转发”必要的选项到 ssh 客户端。

ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"

要在将文件传输到托管主机时重用已打开的 ssh 连接,只需指定另一个未知设置 ssh_tranfer_method 即可。 关于这个主题的文档非常 小气 并且具有误导性,因为这个选项效果很好! 但读书 源代码 允许您了解到底会发生什么:dd 命令将在托管主机上启动,直接处理所需的文件。

transfer_method = piped

顺便说一下,在“develop”分支中也存在这个设置 没有去任何地方.

不怕刀,就怕叉

另一个有用的设置是叉子。 它确定将同时连接到主机并执行任务的工作进程的数量。 由于 Python 作为一种语言的特殊性,使用的是进程,而不是线程,因为 Ansible 仍然支持 Python 2.7 - 没有 asyncio,这里没有必要引入异步行为! 默认情况下 Ansible 运行 工人,但如果询问正确,它将启动更多:

forks = 20

我只是立即警告您,这里可能存在一些与控制机上的可用内存量相关的困难。 换句话说,你当然可以设置forks=100500,但是谁说这样就可以呢?

把它们放在一起

因此,对于 ansible.cfg(ini 格式),必要的设置可能如下所示:

[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped

如果您想隐藏健康人的正常 YaML 库存中的所有内容,那么它可能看起来像这样:

---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m

不幸的是,这不适用于设置“gathering = smart/explicit”和“forks = 20”:它们的 YaML 等效项不存在。 我们要么在 ansible.cfg 中设置它们,要么通过环境变量 ANSIBLE_GATHERING 和 ANSIBLE_FORKS 传递它们。

关于丝拓素
- 关于 Mitogen 的内容在哪里? - 亲爱的读者,你有权询问。 这篇文章中没有任何地方。 但是,如果你真的准备好阅读它的代码并弄清楚为什么你的剧本在 Mitogen 中崩溃,但在普通 Ansible 中运行良好,或者为什么同一个剧本之前运行良好,但在更新后开始做奇怪的事情 - 好吧,Mitogen可能是你的工具。 应用它、理解它、写文章——我会饶有兴趣地阅读它。

为什么我个人不使用 Mitogen? 因为 Gladiolus 只有在任务非常简单并且一切都很好的情况下才有效。 然而,如果你向左或向右转动一点——就是这样,我们已经到了:作为回应,一些模糊的例外向你飞来,为了完成这幅图,所缺少的是常用短语“谢谢大家” ,每个人都是自由的。” 总的来说,我只是不想浪费时间去寻找下一次“地下敲门声”的原因。

其中一些设置是在阅读过程中发现的 源代码 连接插件的名称不言自明“ssh.py”。 我分享阅读的结果,希望它能激励其他人查看源代码、阅读它们、检查实现、与文档进行比较 - 毕竟,所有这些迟早会给你带来积极的结果。 祝你好运!

只有注册用户才能参与调查。 登录拜托

您使用以下哪些 Ansible 设置来加速您的项目?

  • 69,6%流水线=true32

  • 34,8%聚集=智能/显式16

  • 52,2%ssh_args =“-o ControlMaster=auto -o ControlPersist=...”24

  • 17,4%传输方法=管道8

  • 63,0%叉子 = XXX29

  • 6,5%这些都不是,只有 Mitogen3

  • 8,7%Mitogen + 我会记下这些设置中的哪一个4

由 46 位用户投票。 21 位用户弃权。

想要了解更多有关 Ansible 的内容吗?

  • 78,3%是的,当然54

  • 21,7%是的,我只是想要更多硬核的东西!15

  • 0,0%不,这不是没有必要的0

  • 0,0%不,这很复杂!!!0

69 位用户投票。 7 名用户弃权。

来源: habr.com

添加评论