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/python3pour les hôtes python3installé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 python3installés par défaut. Pour autant que je sache, python3est 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
python3et 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: falsequi utilise rawpour 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: trueest requis si vous prévoyez d'exécuter la lecture sur des hôtes qui n'ont pas été apt-getinstallé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
apttrouve 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/python3utilisantraw
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 rawpour exécuter une commande shell pour créer un lien symbolique /usr/bin/python -> /usr/bin/python3si se python3trouve 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
python3présent et pythonnon - il ne remplacera pas Python 2 s'il est déjà installé
- Ne suppose pas
aptest 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