Pagpapabilis ng Ansible sa Mitogen

Ansible naging isa sa pinakasikat Pamamahala ng Configuration ng System. Pagkatapos ay binili ng Red Hat noong 2015 ang bilang mga kalahok sa proyekto lumampas sa libu-libo at ang Ansible ay marahil ang pinakaginagamit na sistema ng pag-deploy at orkestrasyon. Ang malawak na hanay ng mga aplikasyon nito ay lubhang kahanga-hanga.

Gumagana ang Ansible sa mga koneksyon sa SSH sa mga malalayong host. Nagbubukas ito ng session ng SSH, nag-log in, kinokopya ang code ng Python sa network at isinusulat ito sa isang hiwalay na pansamantalang file. Pagkatapos nito, pinapatakbo nito ang file na ito sa remote na makina. Ang buong pagkakasunud-sunod ng mga operasyon ay medyo mahaba at nakakapagod, kaya mayroong iba't ibang mga paraan upang ma-optimize ito.

Isa sa mga paraan na ito ay Mga pipeline ng SSH na nagbibigay-daan sa iyong gumamit ng isang session ng SSH para magsagawa ng mga tagubilin, sa halip na magbukas ng bagong session sa bawat pagkakataon, na makakatipid sa amin ng maraming oras. (Tandaan lamang na i-off requiretty setting para sa sudo sa iyong /etc/sudoers file sa remote na makina)

Ang isang bagong paraan upang mag-overclock sa Ansible ay isang python library na tinatawag Mitogen. Kung sinuman ang hindi pa nakarinig nito, ilalarawan ko nang maikli ang paggana nito. Pinapayagan nito ang mabilis na pagpapatupad ng code ng python sa isang malayong makina, at ang Ansible ay isa lamang halimbawa ng paggamit. Gumagamit si Mitogen ng UNIX pipe sa remote na makina at naglilipat ng code ng python na naka-compress na may zlib at naka-serialize sa pickle. Nakakatulong ito upang makumpleto ito nang mas mabilis at makatipid ng trapiko. Kung interesado ka sa isang mas detalyadong paliwanag, pinakamahusay na basahin ang tungkol dito sa pahina "Paano ito gumagana". Ngunit ngayon ay magtutuon lamang tayo ng pansin sa kung paano gumagana ang library sa Ansible.

Maaaring pabilisin ng Mitogen sa ilang partikular na pagkakataon ang iyong Ansible code nang maraming beses at makabuluhang bawasan ang pagkonsumo ng trapiko. Tingnan natin ang pinakasikat na mga kaso ng paggamit at tingnan kung gaano ito nakakatulong sa atin.

Ginagamit ko ang Ansible karamihan para sa: paglikha ng mga configuration file sa isang remote na makina, pag-install ng mga pakete, pagkopya ng mga file papunta at mula sa remote na makina. Marahil mayroon kang iba pang mga halimbawa - sumulat sa mga komento.

Sabihin pumunta!

Ang pagsasaayos ng mitogen para sa Ansible ay napaka-simple:
I-install ang Mitogen library:

pip install mitogen

Ngayon ay may dalawang katumbas na paraan - alinman sa i-configure ang mga opsyon sa ansible.cfg configuration file, o itakda ang mga kinakailangang variable ng kapaligiran.

Ipagpalagay natin na ang landas patungo sa naka-install na Mitogen ay magiging /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Pagkatapos:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

o

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

I-install natin ang Ansible sa virtualenv, kasama at walang 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

Pakitandaan na ang Mitogen 0.2.7 ay hindi gumagana sa Ansible 2.8 (mula Mayo 2019)

Gumagawa ng mga alias:

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'

Ngayon subukan nating magpatakbo ng playbook na lumilikha ng mga file sa isang malayuang makina:

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

At patakbuhin natin ito nang may at walang Mitogen upang lumikha ng 10 file:

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

Nakikita namin ang 2-tiklop na pagpapabuti. Tingnan natin ang 20, 30, ..., 100 na mga file:

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

Bilang resulta, pinabilis namin ang pagpapatupad ng higit sa 10 beses!
Ngayon subukan natin ang iba't ibang mga sitwasyon at tingnan kung gaano kabilis gumagana ang lahat para sa atin:

  • Script para sa pagkopya ng mga file sa isang malayong host mula sa isang lokal (na may module copy):
    Pagpapabilis ng Ansible sa Mitogen

  • Script para sa paggawa ng mga file sa isang malayuang host gamit ang copy module:
    Pagpapabilis ng Ansible sa Mitogen

  • Sitwasyon sa pag-download ng mga file mula sa isang malayuang host patungo sa isang lokal:
    Pagpapabilis ng Ansible sa Mitogen

Subukan natin ang isang scenario na may ilang (3) remote na makina, halimbawa isang scenario sa pagkopya ng mga file sa isang remote host:
Pagpapabilis ng Ansible sa Mitogen

Gaya ng nakikita mo, ang Mitogen ay nakakatipid sa amin ng oras at trapiko sa mga sitwasyong ito. Ngunit kung ang bottleneck ay wala sa Ansible, ngunit halimbawa sa I/O ng isang disk o network, o sa ibang lugar, mahirap umasa na tutulungan tayo ni Mitogen.

Subukan natin ang isang script na may pag-install ng mga pakete na may yum/dnf at python modules gamit ang pip. Ang mga pakete ay na-cache upang hindi umasa sa mga glitches sa network:

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

Sa Mitogen tumagal ito ng 12 segundo, katulad ng wala nito.
Sa pahina Mitogen para sa pahina ng Ansible maaari kang tumingin sa iba pang mga benchmark at pagsubok. Tulad ng sinasabi ng pahina:

Hindi mapabilis ng Mitogen ang module kapag ito ay tumatakbo. Maaari lamang nitong gawin ang pagpapatupad ng modyul na ito nang mabilis hangga't maaari.

Samakatuwid, mahalagang mahanap ang iyong mga bottleneck sa iyong deployment at kung ang mga ito ay dahil sa Ansible, tutulungan ka ng Mitogen na lutasin ang mga ito at makabuluhang mapabilis ang pagpapatupad ng iyong mga playbook.

Pinagmulan: www.habr.com

Magdagdag ng komento