Ich stoße auf einen Fehler, den ich noch nie gesehen habe. Hier ist der Befehl und der Fehler:
$ ansible-playbook create_api.yml
PLAY [straw] ******************************************************************
GATHERING FACTS ***************************************************************
failed: [104.55.47.224] => {"failed": true, "parsed": false}
/bin/sh: 1: /usr/bin/python: not found
TASK: [typical | install required system packages] *****************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/john/create_api.retry
104.55.47.224 : ok=0 changed=0 unreachable=0 failed=1
Hier ist die Datei create_api.yml:
---
- hosts: api
remote_user: root
roles:
- api
Und hier ist die Hosts-Datei:
[api]
104.55.47.224
Ich kann den Rollenabschnitt entfernen und er schafft es nicht bis zur ersten AUFGABE, sondern nur bis zur Zeile /bin/sh: 1: /usr/bin/python: not found
. Was könnte hier los sein?
HINWEIS: Falls jemand die IP-Adresse anpingt und keine Antwort erhält, sollten Sie wissen, dass ich die IP-Adresse seit dem Einfügen des Codes geändert habe.
EDIT Python wurde lokal installiert. Das Problem war, dass es nicht auf dem Remote-Computer installiert war, auf dem Ubuntu 15.04 ausgeführt wurde
quelle
action: setup
als letzte pre_task auch großartig funktionierte :)raw
Aufgabe auszuführen , um Python 2 zu installierenpre_tasks
. regelmäßigtasks
funktioniert auch gut. Wenn Sie es jedoch zusammenpre_tasks
mit einer anderen Aufgabe eingeben, um auch das Ansible-setup
Modul aufzurufen , wird sichergestellt, dass Fakten für alle Rollen verfügbar sind, die dem Host zugewiesen sind.Ansible 2.2 bietet eine technische Vorschau der Python 3-Unterstützung. Um dies zu nutzen (damit Sie Python 2 nicht unter Ubuntu 16.04 installieren müssen), setzen Sie einfach die
ansible_python_interpreter
Konfigurationsoption auf/usr/bin/python3
. Dies kann pro Host in Ihrer Inventardatei erfolgen:quelle
Lösung 1:
Wenn Sie verwenden
Ansible >2.2.0
, können Sie dieansible_python_interpreter
Konfigurationsoption auf Folgendes einstellen/usr/bin/python3
:oder in Ihrer Inventardatei:
Lösung 2:
Wenn Sie verwenden
Ansible <2.2.0
, können Sie diesepre_tasks
Ihrem Playbook hinzufügen :UPDATE Mit
ansible 2.8.x
, Sie müssen sich keine Sorgen machen, es funktioniert sofort für Python> 3.5 für Controller und Zielcomputer.quelle
ansible 2.3.0.0
und es funktioniert nicht sofort. Gleicher Fehler wie vom OP gepostet.Mit dem Raw-Modul können Sie Python auf den Remote-Hosts installieren:
quelle
pre_tasks: - raw: sudo apt-get install python-simplejson
python-simplejson
ist in Python geschrieben und erfordert daher Python. simplejson ist auch eine Voraussetzung für die meisten Ansible-Kernmodule. Durch die Installationpython-simplejson
überapt-get
/yum
installieren Sie auch Python und decken damit alle grundlegenden Ansible-Abhängigkeiten ab ...Um die Antworten aller anderen zusammenzufassen, sind hier die kombinierten Einstellungen, die für mich funktioniert haben:
quelle
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, diepython3
standardmäßig installiert wurdenIch 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.python3
, können Sie die Variable zu Ihremgroup_vars/all.yml
(oder einem gleichwertigen) hinzufügen :python3
und Sie eine Möglichkeit haben, sie zu kennzeichnen, wenn Sie dynamisches Inventar verwenden (z. B. AWS-Tagging fürec2.py
), können Sie die Variable auf bestimmte Hosts wie folgt anwenden:python3
, können Sie Folgendes tun: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 Folgendesraw
installiert wirdpython
:ignore_errors: true
ist erforderlich, wenn Sie das Spiel auf Hosts ausführen möchten, die dies nicht habenapt-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:
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 erpython3
sich auf dem System befindet undpython
nicht: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:
python3
vorhanden ist undpython
nicht - Python 2 wird nicht überschrieben, wenn es bereits installiert istapt
installiert istapt-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
python3
, was Option 1 viel schwieriger und fehleranfälliger macht./usr/bin/python
.Quellen
/usr/bin/python: not found
Fehler in Ansibleraw
Modul für Ansible-Dokumentequelle
Sie benötigen Python 2.7, um Ansible auszuführen. Unter Ubuntu 16.04 können Sie es über diesen Befehl installieren:
sudo apt-get install python-minimal
Danach konnte ich rennen
ansible-playbook -i inventories/staging playbook.yml
Weitere Informationen finden Sie unter Verwenden von ansible unter Ubuntu 16.04
quelle
Was ich verwendet habe, um dies auf Ubuntu 15.10 auf einem frischen Digital Ocean-Tröpfchen zum Laufen zu bringen:
Für Ubuntu 16.04 auf einer neuen OVH-SSD musste ich ein Upgrade durchführen, bevor die Python2-Pakete verfügbar waren.
quelle
Ich habe herausgefunden, dass es tatsächlich möglich ist, mehrere Spiele in einem einzigen Playbook zu haben. Daher enthält mein Setup jetzt ein Spiel zur Bereitstellung von Abhängigkeiten, das auf allen Hosts ausgeführt wird, und andere Spiele für bestimmte Hosts. Also nicht mehr
pre_tasks
.Beispielsweise:
quelle
Wie andere sagten, liegt dies an fehlendem Python2. Andere Antworten hier bieten eine Abhilfe mit
pre_tasks
undgather_facts: no
, aber wenn Sie auf EC2 sind und Sie drehen die Instanz mit ansible up Sie verwenden können ,user_data
Option:Dann warten die Leute normalerweise darauf, dass ssh wie folgt verfügbar ist:
Ich habe jedoch festgestellt, dass dies nicht immer lang genug ist, da CloudInit ziemlich spät im Startvorgang ausgeführt wird, sodass python2 möglicherweise immer noch nicht direkt nach der Verfügbarkeit von ssh installiert wird. Daher habe ich eine Pause hinzugefügt, falls die Instanz gerade erstellt wurde:
Dies macht den Job perfekt und als Vorteil suchen Sie nicht bei jedem Lauf nach Python2 und müssen keine Problemumgehungen durchführen, um später Fakten zu sammeln.
Ich bin sicher, dass andere Cloud-Anbieter ähnliche CloudInit-Funktionen bereitstellen. Passen Sie sie daher an Ihren Anwendungsfall an.
quelle
Für diejenigen, die Packer verwenden, ist die folgende Lösung möglicherweise hilfreich
Nehmen wir an, Sie verwenden einen ansible Provisioner von Packer. Ihre Konfiguration sieht möglicherweise wie folgt aus
Sie können Python zuerst mit dem Shell-Provisioner installieren und dann die Option ansible_python_intepreter wie unten gezeigt konfigurieren
quelle
Standardmäßig benötigt Ansible Python 2 , Ansible 2.2+ kann jedoch auch mit Python 3 verwendet werden.
Installieren Sie also entweder Python 2 mit dem
raw
Modul , zoder setzen Sie eine
ansible_python_interpreter
Variable in der Inventardatei wie:Für Docker können Sie die folgende Zeile hinzufügen:
oder führen Sie es aus als:
quelle
Entsprechend dieser Zusammenfassung können Sie Python2 unter Ubuntu 16.04 wie folgt installieren:
quelle
Viele Antworten. Vielen Dank für die Veröffentlichung, da ich auch von dieser Seite angefangen habe!
Ich habe ein bisschen gegraben und es war solide mit Ubuntu 14.04LTS, Ubuntu 15.04LTS schien das neueste fallen gelassen zu haben
python
und Ubuntu 16.04LTS scheint gefallen zu seinaptitude
.Ich habe die folgende Aktion in meinen Bootstrap eingefügt, bevor ich
apt
Anrufe tätige:Wenn Sie es
become
anderswo schaffen, können Sie es gerne entfernen.Quellen:
quelle
Ich konnte das gleiche Problem beheben, indem ich Python auf dem Zielcomputer installierte, dh auf dem Computer, auf dem SSH ausgeführt werden soll. Ich hatte folgenden Befehl verwendet:
quelle
@ Miroslav, danke, dass du mich in die richtige Richtung gelenkt hast. Ich habe
user_data
in derec2_instance
Modul verwendet und es funktioniert wie ein Genuss.Dh
quelle
Sie können Ubuntu 18.04 mitteilen, dass Sie Python3 als erste Priorität für verwenden möchten
/usr/bin/python
.quelle
Ich hatte das gleiche Problem, bis mir klar wurde, dass Sie Python auch auf dem Remote-Host sowie auf Ihrem eigenen lokalen Computer installieren müssen. jetzt gehts!
quelle
Wir stoßen einfach darauf.
Wir stellen Ubuntu 16.04 für einen Vagabunden bereit. Wenn Sie also keinen Vagabund verwenden, ist mein Kommentar sinnlos.
Wir haben die folgenden Vagrant-Plugins (Trigger, Shell-Commander) installiert und Python 2.7.6 auf dem Computer installiert (die nicht ohne diese Plugins waren) und nach Ansible bereitstellen können
Es war unser letzter Test, ansonsten wollten wir diese Installation in einen Shell-Befehl in der Vagrant-Datei aufnehmen
Hoffe es kann jemandem helfen
quelle
gather_facts: no
Zeile eingefügt, die Python erfordert. Die andere Möglichkeit ist, dass Sie auch Python auf dem Host-Computer benötigen, aber ich würde vermuten, dass dies Ihnen noch früher im Prozess Fehler verursacht hätte.