Ich persönlich habe 3 mögliche Lösungen für dieses Problem gefunden, die in verschiedenen Situationen gut funktionieren:
Option 1 - ansible_python_interpreter: /usr/bin/python3
Für Hosts festlegen, die python3
standardmäßig installiert wurden
Ich denke, dies ist die überlegene Methode zur Lösung des Problems, wenn Sie eine Möglichkeit haben, Ihre Hosts danach zu gruppieren, ob sie python3
standardmäßig installiert sind oder nicht . Soweit mir bekannt ist, python3
ist es auf allen Ubuntu-Versionen 16.04 und höher verfügbar.
- Wenn alle Ihre Hosts definitiv haben
python3
, können Sie die Variable zu Ihrem group_vars/all.yml
(oder einem gleichwertigen) hinzufügen :
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3
- Wenn einige Ihrer Hosts keine haben
python3
und Sie eine Möglichkeit haben, sie zu kennzeichnen, wenn Sie dynamisches Inventar verwenden (z. B. AWS-Tagging für ec2.py
), können Sie die Variable auf bestimmte Hosts wie folgt anwenden:
# group_vars/tag_OS_ubuntu1804.yml
ansible_python_interpreter: /usr/bin/python3
- Wenn Sie statisches Inventar verwenden und Hosts danach gruppieren können
python3
, können Sie Folgendes tun:
# inventory/hosts
[python2_hosts]
centos7_server
[python3_hosts]
u1804_server
[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
Ich mag diese Option am meisten, weil sie keine Änderungen auf dem Remote-Host und nur geringfügige Änderungen an Variablen erfordert, im Gegensatz zu den Optionen 2 und 3, die Ergänzungen zu jedem Playbook erfordern.
Option 2 - Installieren Sie Python 2 mit raw
Für diese Option muss ein Spiel oben in jedes Spielbuch eingefügt werden, mit gather_facts: false
dem Folgendes raw
installiert wird 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
ist erforderlich, wenn Sie das Spiel auf Hosts ausführen möchten, die dies nicht haben apt-get
installiert sind (z. B. RHEL-basiert), da diese sonst beim ersten Spiel fehlerhaft sind.
Diese Lösung funktioniert, ist jedoch aus mehreren Gründen die niedrigste auf meiner Liste:
- Muss an die Spitze von jedem gehen Spielbuch stehen (im Gegensatz zu Option 1)
- Angenommen, es
apt
befindet sich im System und ignoriert Fehler (im Gegensatz zu Option 3).
apt-get
Befehle sind langsam (im Gegensatz zu Option 3)
Option 3 - Symlink /usr/bin/python -> /usr/bin/python3
mitraw
Ich habe diese von niemand anderem vorgeschlagene Lösung gesehen. Es ist nicht ideal, aber ich denke, es ist Option 2 in vielerlei Hinsicht überlegen. Mein Vorschlag ist, raw
einen Shell-Befehl zum Symlink auszuführen, /usr/bin/python -> /usr/bin/python3
wenn er python3
sich auf dem System befindet und python
nicht:
- 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
Diese Lösung ähnelt Option 2 insofern, als wir sie in jedes Spielbuch einfügen müssen, aber ich denke, dass sie in einigen Punkten überlegen ist:
- Erstellt den Symlink nur in dem speziellen Fall, der
python3
vorhanden ist undpython
nicht - Python 2 wird nicht überschrieben, wenn es bereits installiert ist
- Nimmt nicht an
apt
installiert ist
- Kann ohne spezielle Fehlerbehandlung auf allen Hosts ausgeführt werden
- Ist super schnell im Vergleich zu allem mit
apt-get
Natürlich , wenn Sie benötigen Python 2 installiert an/usr/bin/python
, ist diese Lösung ein nicht gehen und Option 2 ist besser.
Fazit
- Ich schlage vor, in allen Fällen Option 1 zu verwenden, wenn Sie können.
- Ich schlage vor, Option 3 zu verwenden, wenn Ihr Inventar wirklich groß / komplex ist und Sie keine Möglichkeit haben, Hosts einfach zu gruppieren
python3
, was Option 1 viel schwieriger und fehleranfälliger macht.
- Ich empfehle Option 2 gegenüber Option 3 nur, wenn Python 2 unter installiert sein muss
/usr/bin/python
.
Quellen