Acceleriamo Ansible con Mitogen

Ansible è diventato uno dei più popolari sistemi di Configuration Management. Dopo che è stato acquistato da Red Hat nel 2015, il numero dei partecipanti al progetto ha superato le migliaia e Ansible è diventato probabilmente il sistema di deployment e orchestrazione più utilizzato. Le sue ampie aree di applicazione sono molto impressionanti.

Ansible opera tramite connessioni SSH con host remoti. Apre una sessione SSH, effettua il login, copia il codice Python attraverso la rete e lo registra in un file temporaneo separato. Successivamente, esegue questo file sulla macchina remota. Tutta questa sequenza di operazioni è piuttosto lunga e noiosa, quindi ci sono diversi modi per ottimizzarla.

Uno di questi modi è le pipeline SSH che consentono di utilizzare una sola sessione SSH per eseguire le istruzioni, anziché aprire una nuova sessione ogni volta, il che può farci risparmiare molto tempo. (Ricordate solo di disabilitare requiretty nella configurazione per sudo nel vostro /etc/sudoers file sulla macchina remota)

Un nuovo modo per 'accelerare' Ansible è la libreria Python chiamata Mitogen. Se qualcuno non ne ha sentito parlare, lascerò che descriva brevemente le sue funzionalità. Consente l'esecuzione rapida di codice Python su una macchina remota, e Ansible è solo uno degli esempi di utilizzo. Mitogen utilizza pipe UNIX sulla macchina remota e trasmette il codice Python compresso con zlib e serializzato tramite pickle. Ciò contribuisce a eseguirlo più velocemente e a risparmiare traffico. Se sei interessato a una spiegazione più dettagliata, è meglio leggere a riguardo sulla pagina. «Come funziona». Ma oggi ci concentreremo solo sul funzionamento della libreria con Ansible.

Mitogen, in determinate circostanze, può accelerare il tuo codice Ansible di diverse volte e ridurre significativamente il traffico. Controlliamo i più popolari esempi di utilizzo e vediamo quanto ci aiuta.

Utilizzo principalmente Ansible per: creare file di configurazione su una macchina remota, installare pacchetti, copiare file sulla macchina remota e viceversa. Potresti avere altri esempi — scrivili nei commenti.

Andiamo!

La configurazione di Mitogen per Ansible è molto semplice:
Installiamo la libreria Mitogen:

pip install mitogen

Ora ci sono due metodi equivalenti: configurare le opzioni nel file di configurazione ansible.cfg o impostare le variabili di ambiente necessarie.

Supponiamo che il percorso a Mitogen installato sia /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Quindi:

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

Installiamo Ansible in virtualenv, con Mitogen e senza:

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

Nota che Mitogen 0.2.7 non funziona con Ansible 2.8 (a maggio 2019)

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

Adesso proviamo a lanciare un playbook che crea file su una macchina remota:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Crea file con il modulo copia contenuto
      copy:
        content: |
          test file {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

E lo eseguiremo con Mitogen e senza per creare 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

Abbiamo riscontrato un miglioramento di 2 volte. Controlliamo per 20, 30, …, 100 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

In definitiva, abbiamo accelerato l'esecuzione di oltre 10 volte!
Ora proviamo diversi scenari e vediamo quanto sia più veloce tutto:

  • Scenario di copia di file su un host remoto dal locale (con il modulo copy):
    Acceleriamo Ansible con Mitogen

  • Scenario di creazione di file su un host remoto con copy il modulo:
    Acceleriamo Ansible con Mitogen

  • Scenario di scaricamento di file da un host remoto al locale:
    Acceleriamo Ansible con Mitogen

Proviamo uno scenario con più (3) macchine remote, ad esempio uno scenario di copia di file su un host remoto:
Acceleriamo Ansible con Mitogen

Come si può vedere, Mitogen ci fa risparmiare sia tempo che traffico in questi scenari. Tuttavia, se il "collo di bottiglia" non è in Ansible, ma ad esempio nell'I/O del disco o nella rete, o altrove, allora è difficile aspettarsi che Mitogen ci aiuti.

Proviamo uno scenario con l'installazione di pacchetti con yum/dnf e moduli Python utilizzando pip. I pacchetti sono stati memorizzati nella cache per non dipendere da problemi di rete:

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

    - name: Installa moduli pip
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Con Mitogen ci sono voluti 12 secondi, proprio come senza di esso.
Nella pagina Pagina di Mitogen per Ansible puoi vedere altri benchmark e test. Come affermato nella pagina:

Mitogen non può accelerare un modulo mentre è in esecuzione. Può solo rendere l'esecuzione di questo modulo il più veloce possibile.

È quindi importante identificare i tuoi colli di bottiglia nel deployment e, se sono causati da Ansible, Mitogen può aiutarti a risolverli e a velocizzare significativamente l'esecuzione dei tuoi playbook.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster