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
结果,我们将执行速度提高了十倍以上!
现在,让我们尝试不同的方案,看看一切对我们来说有多快:
让我们尝试使用几台(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将帮助您解决这些问题并显着加快执行手册的速度。
编辑:添加了带有模板的脚本