Personalmente ho trovato 3 possibili soluzioni a questo problema che funzionano bene in diverse situazioni:
Opzione 1: impostare ansible_python_interpreter: /usr/bin/python3
per gli host python3
installati per impostazione predefinita
Penso che questo sia il metodo migliore per risolvere il problema se hai un modo per raggruppare i tuoi host, indipendentemente dal fatto che abbiano python3
installati di default. Per quanto ne so, python3
è disponibile su tutte le versioni di Ubuntu 16.04 e successive.
- Se tutti i tuoi host lo hanno sicuramente
python3
, puoi aggiungere la variabile al tuo group_vars/all.yml
(o equivalente):
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Se alcuni dei tuoi host non hanno
python3
e hai un modo per taggarli quando usi lo spazio pubblicitario dinamico (ad es. Tag AWS per ec2.py
), puoi applicare la variabile a determinati host in questo modo:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Se si utilizza l'inventario statico e si è in grado di raggruppare gli host in base al fatto che abbiano
python3
, è possibile fare qualcosa del genere:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Mi piace di più questa opzione perché non richiede modifiche sull'host remoto e solo piccole modifiche alle variabili, al contrario delle opzioni 2 e 3, che richiedono aggiunte a ogni playbook.
Opzione 2: installa Python 2 usando raw
Questa opzione richiede di mettere un gioco in cima a ogni playbook gather_facts: false
che usi raw
per installare python
:
- name: install python2 on all instances
hosts: "*"
gather_facts: false
tasks:
- name: run apt-get update and install python
raw: "{{ item }}"
loop:
- sudo apt-get update
- sudo apt-get -y install python
become: true
ignore_errors: true
ignore_errors: true
è necessario se si prevede di eseguire la riproduzione su host che non dispongono di apt-get
installati (ad es. qualsiasi cosa basata su RHEL), altrimenti si guasteranno alla prima riproduzione.
Questa soluzione funziona, ma è la più bassa della mia lista per alcuni motivi:
- Deve andare in cima a ogni playbook (al contrario dell'opzione 1)
- Presuppone che
apt
sia presente nel sistema e ignora gli errori (rispetto all'opzione 3)
apt-get
i comandi sono lenti (al contrario dell'opzione 3)
Opzione 3 - Symlink /usr/bin/python -> /usr/bin/python3
tramiteraw
Non ho visto questa soluzione proposta da nessun altro. Non è l'ideale, ma penso che sia superiore all'opzione 2 in molti modi. Il mio suggerimento è di usare raw
per eseguire un comando shell per il collegamento simbolico /usr/bin/python -> /usr/bin/python3
se si python3
trova sul sistema e python
non è:
- name: symlink /usr/bin/python -> /usr/bin/python3
hosts: "*"
gather_facts: false
tasks:
- name: symlink /usr/bin/python -> /usr/bin/python3
raw: |
if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
ln --symbolic /usr/bin/python3 /usr/bin/python;
fi
become: true
Questa soluzione è simile all'opzione 2 in quanto dobbiamo metterla in cima a ogni playbook, ma penso che sia superiore in alcuni modi:
- Crea il collegamento simbolico solo nel caso specifico
python3
presente epython
non lo è - non sostituirà Python 2 se è già installato
- Non assume
apt
sia installato
- Può essere eseguito su tutti gli host senza gestione di errori speciali
- È super veloce rispetto a qualsiasi cosa con
apt-get
Ovviamente se ne hai bisogno Python 2 installato su/usr/bin/python
, questa soluzione è assolutamente no e l'opzione 2 è migliore.
Conclusione
- Suggerisco di usare l' opzione 1 in tutti i casi, se possibile.
- Ti suggerisco di utilizzare l' opzione 3 se il tuo inventario è davvero grande / complesso e non hai modo di raggruppare facilmente gli host
python3
, facendo l' opzione 1 molto più difficile e soggetta a errori.
- Suggerisco solo l' opzione 2 rispetto all'opzione 3 se è necessario installare Python 2 su
/usr/bin/python
.
fonti