J'ai personnellement trouvé 3 solutions possibles à ce problème qui fonctionnent bien dans différentes situations:
Option 1 - Définie ansible_python_interpreter: /usr/bin/python3
pour les hôtes python3
installés par défaut
Je pense que c'est la meilleure méthode pour résoudre le problème si vous avez un moyen de regrouper vos hôtes selon qu'ils ont ou non python3
installés par défaut. Pour autant que je sache, python3
est disponible sur toutes les versions d'Ubuntu 16.04 et supérieures.
- Si tous vos hôtes l'ont définitivement
python3
, vous pouvez ajouter la variable à votre group_vars/all.yml
(ou équivalent):
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Si certains de vos hôtes ne l'ont pas
python3
et que vous avez un moyen de les baliser lors de l'utilisation d'un inventaire dynamique (par exemple, le marquage AWS pour ec2.py
), vous pouvez appliquer la variable à certains hôtes comme ceci:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Si vous utilisez un inventaire statique et que vous êtes en mesure de regrouper les hôtes selon qu'ils l'ont fait
python3
, vous pouvez faire quelque chose comme ceci:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
J'aime le plus cette option car elle ne nécessite aucune modification sur l'hôte distant et seulement des modifications mineures des variables, par opposition aux options 2 et 3, qui nécessitent des ajouts à chaque playbook.
Option 2 - Installez Python 2 en utilisant raw
Cette option nécessite de mettre un jeu en haut de chaque playbook avec gather_facts: false
qui utilise raw
pour installer 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
est requis si vous prévoyez d'exécuter la lecture sur des hôtes qui n'ont pas été apt-get
installés (par exemple, tout ce qui est basé sur RHEL), sinon ils se trompent lors de la première lecture.
Cette solution fonctionne, mais est la plus basse de ma liste pour plusieurs raisons:
- Doit aller en haut de chaque playbook (par opposition à l'option 1)
- Suppose qu'il se
apt
trouve sur le système et ignore les erreurs (par opposition à l'option 3)
apt-get
les commandes sont lentes (contrairement à l'option 3)
Option 3 - Symlink /usr/bin/python -> /usr/bin/python3
utilisantraw
Je n'ai vu cette solution proposée par personne d'autre. Ce n'est pas idéal, mais je pense que c'est supérieur à l'option 2 à bien des égards. Ma suggestion est d'utiliser raw
pour exécuter une commande shell pour créer un lien symbolique /usr/bin/python -> /usr/bin/python3
si se python3
trouve sur le système et python
ne l'est pas:
- 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
Cette solution est similaire à l'option 2 en ce sens que nous devons la placer en haut de chaque playbook, mais je pense qu'elle est supérieure à plusieurs égards:
- Crée uniquement le lien symbolique dans le cas spécifique
python3
présent et python
non - il ne remplacera pas Python 2 s'il est déjà installé
- Ne suppose pas
apt
est installé
- Peut s'exécuter sur tous les hôtes sans aucune gestion d'erreur particulière
- Est super rapide par rapport à n'importe quoi avec
apt-get
Évidemment, si vous avez besoin d' installer Python 2 sur /usr/bin/python
, cette solution est interdite et l'option 2 est meilleure.
Conclusion
- Je suggère d'utiliser l' option 1 dans tous les cas si vous le pouvez.
- Je suggère d'utiliser l' option 3 si votre inventaire est vraiment volumineux / complexe et que vous n'avez aucun moyen de regrouper facilement les hôtes
python3
, ce qui rend l' option 1 beaucoup plus difficile et sujette aux erreurs.
- Je ne suggère que l' option 2 par rapport à l' option 3 si vous avez besoin d'installer Python 2 sur
/usr/bin/python
.
Sources