使用 Mitogen 加速 Ansible

Ansible 成为最受欢迎的之一 系统配置管理。 后 被红帽收购 2015年数量 项目参与者 超过数千,Ansible 可能成为最常用的部署和编排系统。 其广泛的应用范围令人印象深刻。

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

其中一种方法是 SSH 管道 它允许你使用一个 SSH 会话来执行指令,而不是每次都打开一个新会话,这可以节省我们很多时间。 (只要记得关掉 requiretty 在你的 sudo 设置 /etc/sudoers 远程计算机上的文件)

超频 Ansible 的一种新方法是一个名为的 Python 库 有丝分裂原。 如果有人还没有听说过它,我将简要描述它的功能。 它允许在远程计算机上快速执行 python 代码,Ansible 只是使用示例之一。 Mitogen 在远程计算机上使用 UNIX 管道,并传输使用 zlib 压缩并使用 pickle 序列化的 python 代码。 这有助于更快地完成并节省流量。 如果您有兴趣更详细的解释,最好阅读页面上的内容 “怎么运行的”。 但今天我们将只关注该库如何与 Ansible 配合使用。

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):
    使用 Mitogen 加速 Ansible

  • 用于在远程主机上创建文件的脚本 copy 模块:
    使用 Mitogen 加速 Ansible

  • 从远程主机下载文件到本地的场景:
    使用 Mitogen 加速 Ansible

让我们尝试一个具有多 (3) 台远程计算机的场景,例如将文件复制到远程主机的场景:
使用 Mitogen 加速 Ansible

正如您所看到的,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 时相同。
在页面上 Ansible 页面的 Mitogen 您可以查看其他基准测试和测试。 正如页面所述:

Mitogen 在运行时无法加速模块。 它只能让这个模块的执行速度尽可能的快。

因此,找到部署中的瓶颈非常重要,如果这些瓶颈是由 Ansible 造成的,那么 Mitogen 将帮助您解决它们并显着加快 playbook 的执行速度。

来源: habr.com

添加评论