Ansible 通过与远程主机的 SSH 连接进行工作。 它打开 SSH 会话、登录、通过网络复制 Python 代码并将其写入单独的临时文件。 之后,它在远程计算机上运行该文件。 整个操作序列相当长且乏味,因此有多种方法可以对其进行优化。
其中一种方法是 requiretty
在你的 sudo 设置 /etc/sudoers
远程计算机上的文件)
超频 Ansible 的一种新方法是一个名为的 Python 库
Mitogen 在某些情况下可以将 Ansible 代码加速数倍并显着减少流量消耗。 让我们看看最流行的用例,看看它对我们有多大帮助。
我最常使用 Ansible:在远程计算机上创建配置文件、安装软件包、将文件复制到远程计算机或从远程计算机复制文件。 也许你还有其他例子 - 请写在评论中。
走吧!
Ansible 的 Mitogen 配置非常简单:
安装 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
让我们在 virtualenv 中安装 Ansible,带或不带 Mitogen:
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 年 XNUMX 月)
制作别名:
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 -e n=10 &>/dev/null
real 0m2.603s
user 0m1.152s
sys 0m0.096s
time pure-ansible-playbook file_creation.yml -i hosts -e n=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 -e n=100 &>/dev/null
real 0m51.775s
user 0m8.039s
sys 0m6.305s
time mitogen-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null
real 0m4.331s
user 0m1.903s
sys 0m0.197s
结果,我们的执行速度提高了 10 倍以上!
现在让我们尝试不同的场景,看看一切对我们来说有多快:
-
用于将文件从本地主机复制到远程主机的脚本(使用模块
copy
):
-
用于在远程主机上创建文件的脚本
copy
模块:
-
从远程主机下载文件到本地的场景:
让我们尝试一个具有多 (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 时相同。
在页面上
Mitogen 在运行时无法加速模块。 它只能让这个模块的执行速度尽可能的快。
因此,找到部署中的瓶颈非常重要,如果这些瓶颈是由 Ansible 造成的,那么 Mitogen 将帮助您解决它们并显着加快 playbook 的执行速度。
来源: habr.com