Ansible funziona su Python e, con Ansible Tower, Python è anche il motore sotto il cofano. Quando ho lavorato con i miei clienti, ho visto alcune domande pratiche che sembrano essere relativamente comuni. Questo articolo fornisce alcuni suggerimenti per la configurazione e la risoluzione dei problemi di virtualenvs in uno scenario Ansible Tower.
1. Che cos'è un virtualenv?
Un virtuale Python è fondamentalmente una directory creata con virtualenv
command (che, come puoi immaginare, è uno script Python).
Una volta che questo virtualenv è stato "attivato", puoi aggiungere moduli Python specifici lì e avere un ambiente isolato per sperimentare e sviluppare senza influenzare i tuoi script e playbook Python/Ansible principali.
Ansible Tower ha due virtualenv nella directory predefinita:awx
e ansible
.
Il primo è: /var/lib/awx/venv/awx.
awx
virtualenv è ad uso esclusivo della stessa Ansible Tower e non deve essere modificato .
L'altro virtualenv è: /var/lib/awx/venv/ansible
. Questo virtualenv è ciò che Tower utilizza per eseguire i modelli (playbook).
Qualcuno potrebbe chiedere:se ho bisogno di aggiungere moduli Python richiesti dai miei playbook Ansible Tower, dovrei aggiungerli sotto l'impostazione predefinita ansible
virtualenv?
Bene, potresti.
Ma probabilmente è un'idea migliore crearne un altro virtualenv se:
- Vuoi mantenere virtualenv predefinito come ambiente di sviluppo stabile e vuoi sperimentare nuovi moduli in un altro virtualenv.
- Hai diversi gruppi di sviluppatori che lavorano con vari progetti che richiedono moduli Python/Ansible specifici.
2. Suggerimenti per configurare un virtualenv
Ci sono ottime spiegazioni ed esempi nella documentazione di Ansible Tower e Python su come configurare un virtualenv.
Normalmente seguo la documentazione di Ansible Tower quando creo un nuovo virtualenv, ma ci sono alcuni argomenti che tendo a trascurare (che in seguito finisce con me che mi gratto la testa chiedendomi:"Hmm... perché non si comporta come mi aspettavo ?").
Autorizzazioni sui moduli Python
Assicurati di osservare la raccomandazione per impostare umask 0022
, non solo quando crea il tuo virtualenv, ma anche quando aggiungi Python moduli ad esso.
Il motivo è che Ansible Tower viene eseguito come utente awx , quindi questo utente deve essere in grado di leggere i moduli Python in virtualenv.
Se le autorizzazioni non sono impostate correttamente, i tuoi modelli/playbook potrebbero darti errori come il modulo XYZ non è installato oppure il modulo XYZ non ha l'attributo ABC quando il problema è in realtà un semplice problema di autorizzazione.
[ I lettori hanno apprezzato anche: Come creare un Playbook Ansible ]
Installa Ansible nel tuo virtualenv
I playbook che desideri eseguire utilizzando virtualenv avranno bisogno dei tuoi moduli Python specifici installati nel tuo virtualenv. Ha senso avere anche il motore Ansible in esecuzione da quel virtualenv.
Puoi utilizzare il comando seguente per installare una versione specifica di Ansible:
sudo /opt/my-envs/xyz/bin/pip install ansible==2.9.15
Nota :Se non specifichi la versione, pip
installa l'ultima versione. Ci sono cambiamenti comportamentali tra Ansible 2.9 e Ansible 2.10, quindi è consigliabile controllare questo documento prima di consentire l'installazione della 2.10 o di una versione più recente.
Usa Pip per elencare i moduli Python
Diciamo che vuoi creare una replica del tuo virtualenv in un altro ambiente, o hai più nodi Ansible Tower e devi replicare virtualenv su tutti i nodi. Per acquisire l'elenco dei moduli per il confronto o la documentazione, puoi utilizzare:
pip list > pip_list.txt
head -5 /tmp/pip_list.txt
Package Version
------------- ---------
ansible 2.9.15
certifi 2020.12.5
cffi 1.14.4
Puoi anche generare un elenco in un formato che consenta l'installazione delle stesse versioni dei moduli da qualche altra parte:
pip freeze > /tmp/pip_freeze.txt
head -3 /tmp/pip_freeze.txt
ansible==2.9.15
certifi==2020.12.5
cffi==1.14.4
È quindi possibile utilizzare questo file di blocco per installare gli stessi moduli con esattamente le stesse versioni utilizzando:
sudo /opt/my-envs/xyz/bin/pip install -r pip_freeze.txt
3. Rendi virtualenvs disponibile nei progetti/modelli Tower
Per impostazione predefinita, Ansible Tower conosce solo i propri virtualenvs.
Per rendere Tower consapevole dei virtualenvs aggiuntivi, hai due opzioni:
- Utilizza le chiamate API REST come descritto nella documentazione di Ansible Tower
- Utilizza l'interfaccia web e vai a IMPOSTAZIONI -> SISTEMA :
Dopo aver eseguito uno di questi due passaggi, potrai selezionare i nuovi virtualenvs quando lavori con Organizzazioni, Progetti e Modelli in Tower:
Nota :Assicurati che la directory virtualenv sia leggibile dall'utente awx . In caso contrario, Tower non elencherà il virtualenv.
"La cosa più importante a cui prestare attenzione è quale virtualenv è attivo e quali binari stanno utilizzando i tuoi playbook."
4. Backup e ripristino di virtualenv
Se esegui un backup completo di Tower (usando il file setup.sh -b
script), verrà eseguito automaticamente il backup di virtualenvs e potrai ripristinarli con setup.sh -r
). Ovviamente, ripristinare in questo modo significa che tutto il resto verrà anche ripristinato.
Se devi eseguire il backup/ripristino di virtualenv, puoi sempre utilizzare strumenti come tar
per farlo.
Inoltre, se hai salvato l'output del tuo pip freeze
comando, puoi ricreare la struttura della directory e utilizzare pip install
comando con -r
argomento come mostrato sopra.
Assicurati che la struttura della directory ripristinata sia leggibile da awx utente in modo che Tower possa riconoscere virtualenv e elencarlo in ANSIBLE ENVIRONMENT campo in Organizzazioni, progetti e modelli.
Nota :In uno scenario con Ansible Tower in esecuzione su OpenShift, le cose sono diverse quando si ha a che fare con virtualenvs. Questo è un argomento per un altro articolo.
5. Versioni di risoluzione dei problemi
Quale versione di Python stai utilizzando?
Una fonte di potenziali problemi è legata alla versione esatta di Python e Pip utilizzata, o alla versione che gli strumenti vedono .
A volte è necessario utilizzare la riga di comando per installare/verificare i moduli Python, quindi è sempre bene controllare quale versione di Python stai utilizzando.
Ad esempio, dopo aver attivato virtualenv, controlla la versione:
source /opt/my-envs/xyz/bin/activate
(xyz) [admin@control my-envs]$ which python
/opt/my-envs/xyz/bin/python
(xyz) [admin@control my-envs]$ which python3
/opt/my-envs/xyz/bin/python3
(xyz) [admin@control my-envs]$ python -V
Python 3.6.8
(xyz) [admin@control my-envs]$ which pip
/opt/my-envs/xyz/bin/pip
(xyz) [admin@control my-envs]$ pip3 -V
pip 20.2.4 from /opt/my-envs/xyz/lib/python3.6/site-packages/pip (python 3.6)
Come puoi vedere nell'esempio sopra, dopo l'attivazione, tutti i comandi puntano a percorsi nel mio virtualenv, che è quello che dovresti aspettarti di vedere, a meno che tu non abbia altre versioni nel tuo percorso, e quello potrebbe creare dei problemi.
Questo è particolarmente importante se lo fai avere altre versioni di Python sul tuo server. A volte potresti voler eseguire il pip
comando come utente root e ciò che root vede come Python predefinito potrebbe non essere ciò che vede il tuo account non root. Ciò causerebbe l'installazione del modulo nell'ambiente Python sbagliato e i modelli che esegui da Tower non troverebbero il modulo.
Invece di eseguire sudo pip install module-name
, usa il percorso completo per pip
per evitare questo problema. Usando il mio scenario precedente come esempio, sarebbe:
sudo /opt/my-envs/xyz/bin/pip install module-name
Quale versione di Ansible stai utilizzando?
Se vedi ancora errori come Nessun modulo denominato XYZ , controlla quale versione di Ansible stai eseguendo dall'output del modello:
Corrisponde alla versione/posizione che hai nel tuo virtualenv?
Non è necessario installare Ansible nel tuo virtualenv, ma tieni presente che se i playbook Ansible vengono eseguiti da un'istanza diversa di Ansible, potrebbe non vedere i moduli Python installati nel tuo virtualenv.
[ Una guida gratuita di Red Hat:5 passaggi per automatizzare il tuo business. ]
Concludi
Virtualenvs è un ottimo modo per creare scenari isolati in cui puoi sperimentare diversi moduli Python/Ansible senza interferire con altri moduli installati. Virtualenvs è facile da ricreare da zero. La cosa più importante a cui prestare attenzione è quale virtualenv è attivo e quali binari stanno utilizzando i tuoi playbook.