è diventato uno dei più popolari . Dopo che nel 2015 il numero ha superato le mille e Ansible è diventato probabilmente il sistema di distribuzione e orchestrazione più utilizzato. Le sue ampie aree di applicazione sono molto impressionanti.
Ansible funziona tramite connessioni SSH a host remoti. Apre una sessione SSH, effettua il login, copia il codice Python sulla rete e lo scrive in un file temporaneo separato. Dopo di che esegue questo file sulla macchina remota. Questa sequenza di operazioni è piuttosto lunga e noiosa, quindi esistono vari modi per ottimizzarla.
Uno di questi modi è che permettono di utilizzare una sola sessione SSH per eseguire le istruzioni, senza dover aprire ogni volta una nuova sessione, risparmiando così molto tempo. (Ricordate solo di disattivare requiretty nell'impostazione per sudo nel vostro /etc/sudoers file sulla macchina remota)
Un nuovo modo per 'accelerare' Ansible è la libreria python chiamata . Se qualcuno non ne ha sentito parlare, riassumerò brevemente la sua funzionalità. Essa consente un'esecuzione rapida del codice python sulla macchina remota e Ansible è solo uno dei tanti esempi di utilizzo. Mitogen utilizza la pipe UNIX sulla macchina remota e trasmette il codice python compresso con zlib e serializzato con pickle. Questo aiuta a eseguirlo più velocemente e a risparmiare traffico. Se siete interessati a una spiegazione più dettagliata, è meglio leggere a riguardo sulla pagina . Ma oggi ci concentreremo solo sull'uso della libreria con Ansible.
Mitogen in determinate circostanze può accelerare il vostro codice Ansible di diversi fattori e ridurre notevolmente il consumo di traffico. Vediamo i più popolari esempi di utilizzo e vediamo quanto ci aiuta.
Utilizzo principalmente Ansible per: creare file di configurazione sulla macchina remota, installare pacchetti, copiare file sulla macchina remota e viceversa. Potreste avere altri esempi — scriveteli nei commenti.
Andiamo!
La configurazione di Mitogen per Ansible è molto semplice:
Installa la libreria Mitogen:
pip install mitogenOra ci sono due modi equivalenti — o configurare le opzioni nel file di configurazione ansible.cfg, oppure 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_linearo
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategyInstalliamo Ansible in virtualenv, con Mitogen e senza di esso:
virtualenv mitogen_ansible
./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen
virtualenv pure_ansible
./pure_ansible/bin/pip install ansible==2.7.10Si noti che Mitogen 0.2.7 non funziona con Ansible 2.8 (a maggio 2019)
Creiamo degli 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'Ora proviamo a eseguire un playbook che crea file sulla macchina remota:
---
- hosts: all
gather_facts: false
tasks:
- name: Crea file con il modulo copy
copy:
content: |
file di test {{ item }}
dest: ~/file_{{ item }}
with_sequence: start=1 end={{ n }}E lo eseguiremo con Mitogen e senza di esso 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.643sVediamo un miglioramento di 2 volte. Controlliamo con 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.197sAlla fine abbiamo accelerato l'esecuzione di oltre 10 volte!
Ora proviamo diversi scenari e vediamo quanto sia più veloce tutto:
Scenario di copia dei file su un host remoto dal locale (con il modulo
copy):
Scenario di creazione di file su un host remoto con
copyil modulo:
Scenario di scaricamento di file da un host remoto al locale:
Proviamo uno scenario con più (3) macchine remote, ad esempio uno scenario di copia dei file su un host remoto:
Come si può vedere, Mitogen ci fa risparmiare sia tempo che traffico in questi scenari. Ma se il "collo di bottiglia" non è in Ansible, ma ad esempio nell'I/O del disco o della rete, o altrove, allora è difficile aspettarsi che Mitogen ci aiuti.
Proviamo uno scenario con l'installazione di pacchetti con yum/dnf e moduli python usando pip. I pacchetti sono stati memorizzati nella cache per non dipendere da bug di rete:
---
- hosts: all
gather_facts: false
tasks:
- name: Installa i pacchetti
become: true
package:
name:
- samba
- httpd
- nano
- ruby
state: present
- name: Installa i moduli pip
become: true
pip:
name:
- pytest-split-tests
- bottle
- pep8
- flask
state: present
Con Mitogen ci sono voluti 12 secondi, come senza di esso.
Nella pagina puoi guardare altri benchmark e test. Come indicato nella pagina:
Mitogen non può accelerare il modulo mentre viene eseguito. Può solo rendere l'esecuzione di questo modulo il più veloce possibile.
Pertanto è importante trovare i tuoi colli di bottiglia nel deployment e se sono causati da Ansible, Mitogen ti aiuterà a risolverli e ad accelerare significativamente l'esecuzione dei tuoi playbook.
Fonte: habr.com
