使用丝裂原加速Ansible

Ansible已成为最受欢迎的配置管理系统之一 。 在2015 年购买Red Hat之后, 项目参与者的数量超过了数千,而Ansible可能是最常用的部署和编排系统。 它的广泛应用令人印象深刻。


Ansible通过与远程主机的SSH连接工作。 他打开SSH会话,进行登录,通过网络复制Python代码并将其写入单独的临时文件。 之后,他在远程计算机上运行此文件。 这整个操作序列非常漫长且乏味,因此有多种方法可以对其进行优化。


这些方法之一是SSH管道 ,它允许您使用一个SSH会话执行指令,而不是每次都打开一个新会话,这可以节省很多时间。 (只记得在远程机器上的/etc/sudoers文件中禁用sudo的requiretty设置)


一种“超频” Ansible的新方法是使用一个称为Mitogen的python库。 如果没有人听说过它,那么我将简要描述它的功能。 它允许在远程计算机上快速执行python代码,而Ansible只是一个用例。 Mitogen在远程计算机上使用UNIX管道,并传递经过压缩的zlib和使用pickle序列化的python代码。 这有助于更快地执行它并节省流量。 如果您对更详细的说明感兴趣,最好在“ 如何工作”页面上进行阅读。 但是今天,我们将只关注Ansible上的库。


在某些情况下,Mitogen可以多次提高您的Ansible代码速度,并显着减少流量消耗。 让我们检查最流行的用例,看看它如何帮助我们。


我最常使用Ansible:在远程计算机上创建配置文件,安装软件包,在远程计算机之间复制文件或从远程计算机复制文件。 也许您还有其他示例-在注释中写。


走吧


Mitogen for Ansible的配置非常简单:
安装Mitogen库:


 pip install mitogen 

现在有两种等效的方法-在ansible.cfg配置文件中配置选项,或设置必要的环境变量。


假设已安装Mitogen的路径为/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy 。 然后:


 export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy export ANSIBLE_STRATEGY=mitogen_linear 


 [defaults] strategy = mitogen_linear strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy 

在带有或不带有Mitogen的virtualenv中安装Ansible:


 virtualenv mitogen_ansible ./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen virtualenv pure_ansible ./pure_ansible/bin/pip install ansible==2.7.10 

请注意,Mitogen 0.2.7不适用于Ansible 2.8(截至2019年5月)


我们做别名:


 alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook' alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook' 

现在,尝试运行在远程计算机上创建文件的剧本:


 --- - hosts: all gather_facts: false tasks: - name: Create files with copy content module copy: content: | test file {{ item }} dest: ~/file_{{ item }} with_sequence: start=1 end={{ n }} 

并在有无Mitogen的情况下运行以创建10个文件:


 time mitogen-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m2.603s user 0m1.152s sys 0m0.096s time pure-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m5.908s user 0m1.745s sys 0m0.643s 

我们看到了2倍的改进。 让我们检查20、30,...,100个文件:


 time pure-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m51.775s user 0m8.039s sys 0m6.305s time mitogen-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m4.331s user 0m1.903s sys 0m0.197s 

结果,我们将执行速度提高了十倍以上!
现在,让我们尝试不同的方案,看看一切对我们来说有多快:


  • 用于将文件从本地复制到远程主机的脚本(带有copy模块):
    上载档案


  • 使用copy模块在远程主机上创建文件的脚本:
    建立档案


  • 将文件从远程主机下载到本地主机的方案:
    正在撷取档案


  • 在Jinja中使用一些变量和计算在专用主机上创建模板的脚本
    模板文件



让我们尝试使用几台(3)远程计算机的方案,例如,将文件复制到远程主机的方案:
将文件上传到多个主机


如您所见,Mitogen在这些情况下为我们节省了时间和流量。 但是,如果“瓶颈”不在Ansible中,例如在I / O磁盘或网络中或其他地方,那么很难指望Mitogen会为我们提供帮助。


让我们尝试一个脚本,使用pip安装带有yum / dnf和python模块的软件包。 程序包已缓存,以便不依赖于网络中的故障:


 --- - hosts: all gather_facts: false tasks: - name: Install packages become: true package: name: - samba - httpd - nano - ruby state: present - name: Install pip modules become: true pip: name: - pytest-split-tests - bottle - pep8 - flask state: present 

使用Mitogen时,花了12秒,而没有了。
Mitogen for Ansible页面上,您可以看到其他基准测试。 如页面上所述:


Mitogen无法在模块执行时加快其速度。 它只能使该模块的执行速度尽可能快。

因此,重要的是要在部署中找到瓶颈,如果瓶颈是由于Ansible造成的,那么Mitogen将帮助您解决这些问题并显着加快执行手册的速度。


编辑:添加了带有模板的脚本

Source: https://habr.com/ru/post/zh-CN453520/


All Articles