与Mitogen一起加快Ansible!
→ 俄语版
Ansible是当今最受欢迎的配置管理系统之一 。 在2015年被Red Hat收购之后,Ansible已经达到了成千上万的贡献者,并可能成为最常用的部署和编排工具之一。 它的用例令人印象深刻。
Ansible通过与远程主机的SSH连接工作。 它打开SSH会话,登录到Shell,通过网络复制python代码,并使用此代码在远程主机上创建一个临时文件。 在下一步中,它将使用python解释器执行当前文件。 所有这些工作流程都很繁琐,有多种方法可以使其变得更快,更轻便。
其中一种方法是使用SSH管道 ,该管道重用一个SSH会话来复制多个任务的python代码,并防止打开多个会话,从而节省了大量时间。 (只是不要忘记在/etc/sudoers
的远端禁用sudo的requiretty
设置)
加快Ansible速度的新方法是名为Mitogen的强大python库。 如果像我这样的人不熟悉它-这个库允许在远程主机上快速执行python代码,而Ansible只是其中一种情况。 Mitogen在传递通过zlib压缩的“腌制” python代码的同时,在远程计算机上使用UNIX管道。 这样可以快速运行它,而不会带来太多流量。 如果您有兴趣,可以在其“工作原理”页面中阅读有关其工作原理的详细信息。 但是我们今天将重点关注其中的Ansible相关部分。
在特定情况下,Mitogen可以在几倍内加快Ansible的速度,并显着降低带宽。 让我们检查最流行的用例,并找出是否对我们有用。
对于我来说,运行Ansible的最流行用例是:在远程主机上创建配置文件,打包安装,从远程主机下载文件以及将文件上传到远程主机。 也许您想检查其他用例,请对本文发表评论。
让我们开始吧!
为Ansible配置Mitogen非常简单:
安装Mitogen模块:
pip install mitogen
然后配置环境变量或在ansible.cfg文件中设置配置选项,两个选项都可以:
假设/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
是安装Mitogen库的路径。
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=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy:$(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当然会帮助您。
让我们运行例如使用yum / dnf进行软件包安装以及使用pip进行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和纯Ansible都需要12秒。
在Mitogen for Ansible页面中,您可以看到其他基准和测量结果。 如页面所声明:
Mitogen无法在模块执行后对其进行改进,只能确保模块尽快执行
这就是为什么找到瓶颈在哪里以及与Ansible操作相关的瓶颈很重要的原因,Mitogen将帮助您解决瓶颈并显着提高您的游戏手册。