Få opp hastigheten på Ansible med Mitogen

Ansible ble en av de mest populære Configuration Management systemer. Etter at ble kjøpt av Red Hat i 2015 nådde antallet deltakere i prosjektet overskred tusen, og Ansible har blitt kanskje det mest brukte systemet for distribusjon og orkestrering. Dets brede bruksområder er veldig imponerende.

Ansible fungerer via SSH-tilkoblinger til eksterne vertsmaskiner. Den åpner en SSH-økt, logger inn, kopierer Python-kode over nettet, og lagrer den i en separat midlertidig fil. Deretter kjører den denne filen på den eksterne maskinen. Hele denne sekvensen av operasjoner er ganske langvarig og kjedelig, så det finnes forskjellige måter å optimalisere den på.

En av disse måtene er SSH pipelines som lar oss bruke én SSH-økt for å utføre instruksjoner i stedet for å åpne en ny økt hver gang, noe som kan spare oss for mye tid. (Bare ikke glem å slå av requiretty innstillingen for sudo i din /etc/sudoers fil på den eksterne maskinen)

En ny måte å «frekvensheve» Ansible på er en Python-bibliotek som heter Mitogen. Hvis noen ikke har hørt om det – så skal jeg kort beskrive funksjonaliteten. Den muliggjør rask kjøring av Python-kode på eksterne maskiner, og Ansible er bare ett av bruksområdene. Mitogen bruker UNIX-pipe på den eksterne maskinen og sender Python-kode komprimert med zlib og serialisert ved hjelp av pickle. Dette bidrar til å kjøre det raskere og sparer båndbredde. Hvis du er interessert i en mer detaljert forklaring, er det best å lese om dette på siden «How it works». Men i dag skal vi fokusere bare på bibliotekets arbeid med Ansible.

Mitogen kan i visse omstendigheter akselerere Ansible-koden din flere ganger og betydelig redusere båndbreddebruken. La oss sjekke de mest populære bruksområdene og se hvor mye det hjelper oss.

Jeg bruker mest Ansible til: å opprette konfigurasjonsfiler på den eksterne maskinen, installere pakker, kopiere filer til den eksterne maskinen og tilbake. Kanskje har du andre eksempler – skriv dem i kommentarene.

La oss gå!

Konfigurasjonen av Mitogen for Ansible er veldig enkel:
Installer Mitogen-biblioteket:

pip install mitogen

Nå er det to like måter – enten å konfigurere alternativene i konfigurasjonsfilen ansible.cfg, eller å sette de nødvendige miljøvariablene.

La oss anta at stien til den installerte Mitogen vil være /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Da:

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

eller

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

La oss installere Ansible i virtualenv, med og uten 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

Merk at Mitogen 0.2.7 ikke fungerer med Ansible 2.8 (per mai 2019)

Vi lager aliaser:

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'

Nå skal vi prøve å kjøre et playbook som lager filer på en ekstern maskin:

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

Og vi kjører med Mitogen og uten for å lage 10 filer:

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

Vi ser en forbedring på 2 ganger. La oss sjekke for 20, 30, …, 100 filer:

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

Som et resultat har vi akselerert utførelsen med mer enn 10 ganger!
Nå skal vi prøve forskjellige scenarier og se hvor mye raskere alt fungerer:

  • Scenario for å kopiere filer til en ekstern vert fra lokal (med modulen copy):
    Få opp hastigheten på Ansible med Mitogen

  • Scenario for å opprette filer på en ekstern vert med copy modulen:
    Få opp hastigheten på Ansible med Mitogen

  • Scenario for å laste ned filer fra en ekstern vert til lokal:
    Få opp hastigheten på Ansible med Mitogen

Vi prøver et scenario med flere (3) eksterne maskiner, for eksempel scenariet med å kopiere filer til en ekstern vert:
Få opp hastigheten på Ansible med Mitogen

Som vi kan se, sparer Mitogen både tid og båndbredde i disse scenariene. Men hvis «flaskehalsen» ikke er i Ansible, men for eksempel i disk I/O eller nettverket, eller et annet sted, er det vanskelig å forvente at Mitogen vil hjelpe oss.

La oss prøve et scenario med å installere pakker med yum/dnf og Python-moduler med pip. Pakker ble hurtigbufferlagret for ikke å være avhengig av nettverksproblemer:

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

Med Mitogen tok dette 12 sekunder, akkurat som uten det.
På siden Mitogen for Ansible page Du kan se andre benchmarker og tester. Som det angis på siden:

Mitogen kan ikke akselerere en modul når den blir kjørt. Den kan bare gjøre kjøringen av denne modulen så rask som mulig.

Derfor er det viktig å finne dine flaskehalser i distribusjonen, og hvis de skyldes Ansible, vil Mitogen hjelpe deg med å løse dem og betydelig akselerere utførelsen av playbookene dine.

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster