ืœื”ืื™ืฅ ืืช Ansible ืขื Mitogen

ื‘ืœืชื™ ืืคืฉืจื™ ื”ืคืš ืœืื—ื“ ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ื ื™ื”ื•ืœ ืชืฆื•ืจืช ืžืขืจื›ืช. ืœืื—ืจ ื ืจื›ืฉ ืขืœ ื™ื“ื™ Red Hat ื‘ืฉื ืช 2015 ื”ืžืกืคืจ ืžืฉืชืชืคื™ ื”ืคืจื•ื™ืงื˜ ืขืœื” ืขืœ ืืœืคื™ื ื•-Ansible ื”ืคื›ื” ื›ื ืจืื” ืœืžืขืจื›ืช ื”ืคืจื™ืกื” ื•ื”ืชื–ืžื•ืจ ื”ื ืคื•ืฆื” ื‘ื™ื•ืชืจ. ืžื’ื•ื•ืŸ ื”ื™ื™ืฉื•ืžื™ื ื”ืจื—ื‘ ืฉืœื• ืžืจืฉื™ื ืžืื•ื“.

Ansible ืขื•ื‘ื“ ืขืœ ื—ื™ื‘ื•ืจื™ SSH ืœืžืืจื—ื™ื ืžืจื•ื—ืงื™ื. ื”ื•ื ืคื•ืชื— ื”ืคืขืœืช SSH, ืžืชื—ื‘ืจ, ืžืขืชื™ืง ืืช ืงื•ื“ Python ื“ืจืš ื”ืจืฉืช ื•ื›ื•ืชื‘ ืื•ืชื• ืœืงื•ื‘ืฅ ื–ืžื ื™ ื ืคืจื“. ืœืื—ืจ ืžื›ืŸ, ื”ื•ื ืžืจื™ืฅ ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื‘ืžื—ืฉื‘ ื”ืžืจื•ื—ืง. ื›ืœ ืจืฆืฃ ื”ืคืขื•ืœื•ืช ื”ื–ื” ื”ื•ื ื“ื™ ืืจื•ืš ื•ืžื™ื™ื’ืข, ื•ืœื›ืŸ ื™ืฉื ืŸ ื“ืจื›ื™ื ืฉื•ื ื•ืช ืœื™ื™ืขืœ ืื•ืชื•.

ืื—ืช ื”ื“ืจื›ื™ื ื”ืœืœื• ื”ื™ื ืฆื™ื ื•ืจื•ืช SSH ืžื” ืฉืžืืคืฉืจ ืœืš ืœื”ืฉืชืžืฉ ื‘ืกืฉืŸ SSH ืื—ื“ ืœื‘ื™ืฆื•ืข ื”ื•ืจืื•ืช, ื‘ืžืงื•ื ืœืคืชื•ื— ื‘ื›ืœ ืคืขื ืกืฉืŸ ื—ื“ืฉ, ืžื” ืฉื™ื›ื•ืœ ืœื—ืกื•ืš ืœื ื• ื”ืจื‘ื” ื–ืžืŸ. (ืจืง ื–ื›ืจื• ืœื›ื‘ื•ืช requiretty ื”ื’ื“ืจื” ืขื‘ื•ืจ sudo ืืฆืœืš /etc/sudoers ืงื•ื‘ืฅ ื‘ืžื—ืฉื‘ ื”ืžืจื•ื—ืง)

ื“ืจืš ื—ื“ืฉื” ืœื‘ืฆืข overclock Ansible ื”ื™ื ืกืคืจื™ื™ืช ืคื™ืชื•ืŸ ืฉื ืงืจืืช ืžื™ื˜ื•ื’ืŸ. ืื ืžื™ืฉื”ื• ืœื ืฉืžืข ืขืœ ื–ื”, ืื ื™ ืืชืืจ ื‘ืงืฆืจื” ืืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืฉืœื•. ื–ื” ืžืืคืฉืจ ื”ืคืขืœื” ืžื”ื™ืจื” ืฉืœ ืงื•ื“ ืคื™ืชื•ืŸ ืขืœ ืžื—ืฉื‘ ืžืจื•ื—ืง, ื•-Ansible ื”ื™ื ืจืง ื“ื•ื’ืžื” ืื—ืช ืœืฉื™ืžื•ืฉ. Mitogen ืžืฉืชืžืฉ ื‘ืฆื™ื ื•ืจ UNIX ื‘ืžื›ื•ื ื” ื”ืžืจื•ื—ืงืช ื•ืžืขื‘ื™ืจ ืงื•ื“ ืคื™ืชื•ืŸ ื“ื—ื•ืก ืขื zlib ื•ื‘ืกื“ืจื” ืขื ืžืœืคืคื•ืŸ ื—ืžื•ืฅ. ื–ื” ืขื•ื–ืจ ืœื”ืฉืœื™ื ืืช ื–ื” ืžื”ืจ ื™ื•ืชืจ ื•ื—ื•ืกืš ืชื ื•ืขื”. ืื ืืชื ืžืขื•ื ื™ื™ื ื™ื ื‘ื”ืกื‘ืจ ืžืคื•ืจื˜ ื™ื•ืชืจ, ืขื“ื™ืฃ ืœืงืจื•ื ืขืœ ื›ืš ื‘ืขืžื•ื“ "ืื™ืš ื–ื” ืขื•ื‘ื“". ืื‘ืœ ื”ื™ื•ื ื ืชืžืงื“ ืจืง ืื™ืš ื”ืกืคืจื™ื™ื” ืขื•ื‘ื“ืช ืขื Ansible.

Mitogen ื‘ื ืกื™ื‘ื•ืช ืžืกื•ื™ืžื•ืช ื™ื›ื•ืœ ืœื”ืื™ืฅ ืืช ืงื•ื“ ื”-Ansible ืฉืœืš โ€‹โ€‹ืžืกืคืจ ืคืขืžื™ื ื•ืœื”ืคื—ื™ืช ืžืฉืžืขื•ืชื™ืช ืืช ืฆืจื™ื›ืช ื”ืชื ื•ืขื”. ื‘ื•ืื• ื ื‘ื“ื•ืง ืืช ืžืงืจื™ ื”ืฉื™ืžื•ืฉ ื”ืคื•ืคื•ืœืจื™ื™ื ื‘ื™ื•ืชืจ ื•ื ืจืื” ื›ืžื” ื–ื” ืขื•ื–ืจ ืœื ื•.

ืื ื™ ืžืฉืชืžืฉ ื‘-Ansible ื‘ืขื™ืงืจ ืขื‘ื•ืจ: ื™ืฆื™ืจืช ืงื•ื‘ืฆื™ ืชืฆื•ืจื” ื‘ืžื—ืฉื‘ ืžืจื•ื—ืง, ื”ืชืงื ืช ื—ื‘ื™ืœื•ืช, ื”ืขืชืงืช ืงื‘ืฆื™ื ืืœ ื”ืžื—ืฉื‘ ื”ืžืจื•ื—ืง ื•ืžืžื ื•. ืื•ืœื™ ื™ืฉ ืœืš ืขื•ื“ ื“ื•ื’ืžืื•ืช - ื›ืชื‘ื• ื‘ืชื’ื•ื‘ื•ืช.

ื‘ื•ืื• ื ืœืš!

ืชืฆื•ืจืช ืžื™ื˜ื•ื’ืŸ ืขื‘ื•ืจ Ansible ื”ื™ื ืคืฉื•ื˜ื” ืžืื•ื“:
ื”ืชืงืŸ ืืช ืกืคืจื™ื™ืช ืžื™ื˜ื•ื’ืŸ:

pip install mitogen

ื›ืขืช ื™ืฉื ืŸ ืฉืชื™ ื“ืจื›ื™ื ืฉื•ื•ืช - ืื• ืœื”ื’ื“ื™ืจ ืืช ื”ืืคืฉืจื•ื™ื•ืช ื‘ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ansible.cfg, ืื• ืœื”ื’ื“ื™ืจ ืืช ืžืฉืชื ื™ ื”ืกื‘ื™ื‘ื” ื”ื“ืจื•ืฉื™ื.

ื‘ื•ืื• ื ื ื™ื— ืฉื”ื ืชื™ื‘ ืœืžื™ื˜ื•ื’ืŸ ื”ืžื•ืชืงืŸ ื™ื”ื™ื” /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

ื‘ื•ืื• ื ืชืงื™ืŸ ืืช Ansible ื‘-virtualenv, ืขื ื•ื‘ืœื™ 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)

ื™ืฆื™ืจืช ื›ื™ื ื•ื™ื™ื:

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 }}

ื•ื‘ื•ืื• ื ืจื™ืฅ ืืช ื–ื” ืขื ื•ื‘ืœื™ ืžื™ื˜ื•ื’ืŸ ื›ื“ื™ ืœื™ืฆื•ืจ 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):
    ืœื”ืื™ืฅ ืืช Ansible ืขื Mitogen

  • ืกืงืจื™ืคื˜ ืœื™ืฆื™ืจืช ืงื‘ืฆื™ื ืขืœ ืžืืจื— ืžืจื•ื—ืง ืขื copy ืžื•ื“ื•ืœ:
    ืœื”ืื™ืฅ ืืช Ansible ืขื Mitogen

  • ืชืจื—ื™ืฉ ืขื ื”ื•ืจื“ืช ืงื‘ืฆื™ื ืžืžืืจื— โ€‹โ€‹ืžืจื•ื—ืง ืœืžืืจื— ืžืงื•ืžื™:
    ืœื”ืื™ืฅ ืืช Ansible ืขื Mitogen

ื‘ื•ืื• ื ื ืกื” ืชืจื—ื™ืฉ ืขื ืžืกืคืจ (3) ืžื›ื•ื ื•ืช ืžืจื•ื—ืงื•ืช, ืœืžืฉืœ ืชืจื—ื™ืฉ ืขื ื”ืขืชืงืช ืงื‘ืฆื™ื ืœืžืืจื— ืžืจื•ื—ืง:
ืœื”ืื™ืฅ ืืช Ansible ืขื Mitogen

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ืžื™ื˜ื•ื’ืŸ ื—ื•ืกืš ืœื ื• ื–ืžืŸ ื•ืชื ื•ืขื” ื‘ืชืจื—ื™ืฉื™ื ืืœื”. ืื‘ืœ ืื ืฆื•ื•ืืจ ื”ื‘ืงื‘ื•ืง ื”ื•ื ืœื ื‘-Ansible, ืืœื ืœืžืฉืœ ื‘-I/O ืฉืœ ื“ื™ืกืง ืื• ืจืฉืช, ืื• ื‘ืžืงื•ื ืื—ืจ, ืื– ืงืฉื” ืœืฆืคื•ืช ืฉืžื™ื˜ื•ื’ืŸ ื™ืขื–ื•ืจ ืœื ื•.

ื‘ื•ืื• ื ื ืกื” ืกืงืจื™ืคื˜ ืขื ื”ืชืงื ืช ื—ื‘ื™ืœื•ืช ืขื ืžื•ื“ื•ืœื™ yum/dnf ื•-python ื‘ืืžืฆืขื•ืช pip. ื”ื—ื‘ื™ืœื•ืช ื ืฉืžืจื• ื‘ืžื˜ืžื•ืŸ ื›ื“ื™ ืœื ืœื”ื™ื•ืช ืชืœื•ื™ื•ืช ื‘ืชืงืœื•ืช ืจืฉืช:

---
- 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

ืขื ืžื™ื˜ื•ื’ืŸ ื–ื” ืœืงื— 12 ืฉื ื™ื•ืช, ื›ืžื• ื‘ืœืขื“ื™ื•.
ื‘ื“ืฃ ืžื™ื˜ื•ื’ืŸ ืขื‘ื•ืจ ืขืžื•ื“ Ansible ืืชื” ื™ื›ื•ืœ ืœื”ืกืชื›ืœ ืขืœ ืžื“ื“ื™ื ื•ืžื‘ื—ื ื™ื ืื—ืจื™ื. ื›ืคื™ ืฉื›ืชื•ื‘ ื‘ืขืžื•ื“:

Mitogen ืœื ื™ื›ื•ืœ ืœื”ืื™ืฅ ืืช ื”ืžื•ื“ื•ืœ ื›ืฉื”ื•ื ืคื•ืขืœ. ื–ื” ื™ื›ื•ืœ ืจืง ืœื”ืคื•ืš ืืช ื”ื‘ื™ืฆื•ืข ืฉืœ ืžื•ื“ื•ืœ ื–ื” ืžื”ืจ ื›ื›ืœ ื”ืืคืฉืจ.

ืœื›ืŸ, ื—ืฉื•ื‘ ืœืžืฆื•ื ืืช ืฆื•ื•ืืจื™ ื”ื‘ืงื‘ื•ืง ืฉืœื›ื ื‘ืคืจื™ืกื” ืฉืœื›ื ื•ืื ื”ื ื ื•ื‘ืขื™ื ืž-Ansible, ืื– Mitogen ืชืขื–ื•ืจ ืœื›ื ืœืคืชื•ืจ ืื•ืชื ื•ืชื–ืจื– ืžืฉืžืขื•ืชื™ืช ืืช ื‘ื™ืฆื•ืข ืกืคืจื™ ื”ืžืฉื—ืงื™ื ืฉืœื›ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”