Ansible ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· SSH ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΌ Ρ ΠΎΡΡΠ°ΠΌ. ΠΠ½ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ SSH ΡΠ΅ΡΡΠΈΡ, Π΄Π΅Π»Π°Π΅Ρ Π»ΠΎΠ³ΠΈΠ½, ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΊΠΎΠ΄ Π½Π° Python ΠΏΠΎ ΡΠ΅ΡΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ». ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. ΠΡΡ ΡΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄ΠΎΠ»Π³Π°Ρ ΠΈ Π½ΡΠ΄Π½Π°Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΅Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠΈΡ
ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ requiretty
Π½Π°ΡΡΡΠΎΠΉΠΊΡ Π΄Π»Ρ sudo Π² Π²Π°ΡΠ΅ΠΌ /etc/sudoers
ΡΠ°ΠΉΠ»Π΅ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅)
ΠΠΎΠ²ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ «ΡΠ°Π·ΠΎΠ³Π½Π°ΡΡ» Ansible ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° python ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ
Mitogen Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΊΠΎΡΠΈΡΡ Π²Π°Ρ Ansible ΠΊΠΎΠ΄ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°ΡΡ ΠΎΠ΄ ΡΡΠ°ΡΠΈΠΊΠ°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ°ΠΌΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΌ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ.
Π― Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ansible Π΄Π»Ρ: ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ β Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ .
ΠΠΎΠ΅Ρ Π°Π»ΠΈ!
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Mitogen Π΄Π»Ρ 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
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ 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)
ΠΠ΅Π»Π°Π΅ΠΌ aliases:
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'
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ 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 Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ 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
Π‘ Mitogen ΡΡΠΎ Π²Π·ΡΠ»ΠΎ 12 ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠ°ΠΊ ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ.
ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅
Mitogen Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΊΠΎΡΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π±ΡΡΡΡΡΠΌ Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΠΎΡΡΠΎΠΌΡ Π²Π°ΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π²Π°ΡΠΈ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ° Π² ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠΈ ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΈΠ·-Π·Π° Ansible, ΡΠΎ Mitogen ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ ΡΠ΅ΡΠΈΡΡ ΠΈΡ ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π°ΡΠΈΡ playbooks.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com