Accelererer Ansible med Mitogen

Ansible blev en af de mest populære Configuration Management systemer. Efter at blev købt af Red Hat i 2015 oversteg antallet af projekt deltagere tusinder, og Ansible blev nok det mest anvendte system til deployment og orchestration. Dets brede anvendelsesområder er meget imponerende.

Ansible arbejder via SSH-forbindelser til eksterne værter. Det åbner en SSH-session, logger ind, kopierer Python-koden over netværket og gemmer den i en midlertidig fil. Derefter kører det denne fil på den eksterne maskine. Hele denne sekvens af operationer er ret lang og kedelig, derfor findes der forskellige måder at optimere den på.

En af disse måder er SSH pipelines som gør det muligt at bruge én SSH-session til at udføre instruktioner i stedet for at åbne en ny session hver gang, hvilket kan spare os meget tid. (Bare glem ikke at deaktivere requiretty indstillingen for sudo i din /etc/sudoers fil på den eksterne maskine)

En ny måde at 'booste' Ansible på er et Python-bibliotek ved navn Mitogen. Hvis nogen ikke har hørt om det — så vil jeg kort beskrive dets funktionalitet. Det muliggør hurtig udførelse af Python-kode på den eksterne maskine, og Ansible er kun et af eksemplerne på brugen. Mitogen bruger UNIX-pipes på den eksterne maskine og overfører Python-koden, komprimeret med zlib og serialiseret med pickle. Dette hjælper med at køre det hurtigere og sparer båndbredde. Hvis du er interesseret i en mere detaljeret forklaring, er det bedst at læse om det på siden «How it works». Men i dag fokuserer vi kun på, hvordan biblioteket arbejder med Ansible.

Mitogen kan under bestemte omstændigheder accelerere din Ansible-kode flere gange og betydeligt reducere båndbåndsforbruget. Lad os tjekke de mest populære anvendelseseksempler og se, hvor meget det hjælper os.

Jeg bruger mest Ansible til: at oprette konfigurationsfiler på den eksterne maskine, installere pakker, kopiere filer til og fra den eksterne maskine. Måske har du andre eksempler — skriv i kommentarerne.

Lad os komme i gang!

Konfigurationen af Mitogen til Ansible er meget enkel:
Installer Mitogen-biblioteket:

pip install mitogen

Nu er der to lige muligheder — enten at konfigurere indstillingerne i ansible.cfg-filen eller at sætte de nødvendige miljøvariabler.

Lad os antage, at stien til den installerede Mitogen vil være /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Sådan:

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

Lad Ansible i virtualenv, med Mitogen og uden:

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

Bemærk, at Mitogen 0.2.7 ikke fungerer med Ansible 2.8 (pr. maj 2019)

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

Lad os nu prøve at køre et playbook, der opretter filer på en fjernmaskine:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Opret filer med copy content-modulet
      copy:
        content: |
          testfil {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

Og lad os køre det med og uden Mitogen for at oprette 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 gange. Lad os kontrollere 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

Resultatet er, at vi har accelereret eksekveringen mere end 10 gange!
Lad os nu prøve forskellige scenarier og se, hvor hurtigt alt fungerer:

  • Scenarie for at kopiere filer til en fjernhost fra lokale (med modulet copy):
    Accelererer Ansible med Mitogen

  • Scenarie for at oprette filer på en fjernhost med copy modulet:
    Accelererer Ansible med Mitogen

  • Scenarie for at hente filer fra en fjernhost til lokale:
    Accelererer Ansible med Mitogen

Lad os prøve et scenarie med flere (3) fjernmaskiner, for eksempel et scenarie for at kopiere filer til en fjernhost:
Accelererer Ansible med Mitogen

Som det ses, sparer Mitogen både tid og båndbredde i disse scenarier. Men hvis "flaskehalsen" ikke er i Ansible, men for eksempel i disk I/O eller netværket, eller et andet sted, er det svært at forvente, at Mitogen vil hjælpe os.

Lad os prøve et scenarie med installation af pakker med yum/dnf og Python-moduler ved hjælp af pip. Pakkerne blev cachelagret for ikke at være afhængige af netværksproblemer:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Installer pakker
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Installer pip-moduler
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Med Mitogen tog det 12 sekunder, ligesom uden det.
På siden Mitogen for Ansible-siden du kan se andre benchmarking- og testresultater. Som det angives på siden:

Mitogen kan ikke accelerere modulet, når det udføres. Det kan kun gøre udførelsen af dette modul så hurtig som muligt.

Derfor er det vigtigt at finde dine flaskehalse i implementeringen, og hvis de skyldes Ansible, så kan Mitogen hjælpe dig med at løse dem og betydeligt øge hastigheden på dine playbooks.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster