So beheben Sie den Ansible-Fehler „Freigegebene Verbindung zu x.x.xx geschlossen“.
In diesem kurzen Artikel erklären wir, wie man das Problem löst: „module_stderr“: „Gemeinsame Verbindung zu x.x.x.x geschlossen.\r\n“, „module_stdout“: „/bin/sh: /usr/ bin/python: Keine solche Datei oder kein solches Verzeichnis\r\n“, während Ansible-Befehle ausgeführt werden.
Der folgende Screenshot zeigt den Ansible-Modulfehler. Dieser Fehler ist beim Ausführen eines Ansible-Befehls zum Ausführen von Befehlen auf zwei neu bereitgestellten CentOS 8-Servern aufgetreten.
Den Fehlerdetails zufolge ist die Verbindung fehlgeschlagen, weil die Shell(s) im Remote-System den Python-Interpreter (/usr/bin/python) nicht finden konnten, wie durch angegeben die Zeile: „module_stdout“: „/bin/sh: /usr/bin/python: Keine solche Datei oder kein solches Verzeichnis\r\n“.
Nachdem wir die Remote-Hosts überprüft hatten, stellten wir fest, dass auf den Systemen kein Python 2 installiert war.
Sie haben standardmäßig Python 3 installiert und die Binärdatei ist /usr/bin/python3.
Laut der Ansible-Dokumentation funktioniert Ansible (2.5 und höher) nur mit Python Version 3 und höher. Außerdem soll Ansible Python 3 auf vielen Plattformen, die damit ausgeliefert werden, automatisch erkennen und verwenden.
Sollte dies jedoch fehlschlagen, können Sie einen Python-3-Interpreter explizit konfigurieren, indem Sie die Inventarvariable ansible_python_interpreter auf Gruppen- oder Hostebene auf den Speicherort eines Python-3-Interpreters setzen, wie unten beschrieben.
Übergabe des Python-Interpreters an Ansible in der Befehlszeile
Um den oben genannten Fehler vorübergehend zu beheben, können Sie das Flag -e
verwenden, um den Python 3-Interpreter wie gezeigt an Ansible zu übergeben.
ansible prod_servers -e 'ansible_python_interpreter=/usr/bin/python3' -a "systemctl status firewalld" -u root
Festlegen des Python-Interpreters für Ansible im Inventar
Um den Fehler dauerhaft zu beheben, legen Sie die Inventarvariable ansible_python_interpreter in Ihrem Inventar /etc/ansible/hosts fest. Sie können es wie gezeigt mit dem V/IM- oder Nano-Texteditor zur Bearbeitung öffnen.
sudo vim /etc/ansible/hosts
OR
vim /etc/ansible/hosts
Hängen Sie die folgende Zeile an jeden Host oder jede Hosts in einer Gruppe an:
ansible_python_interpreter=/usr/bin/python3
Die Definitionen Ihrer Hosts können also wie folgt aussehen:
[prod_servers]
192.168.10.1 ansible_python_interpreter=/usr/bin/python3
192.168.10.20 ansible_python_interpreter=/usr/bin/python3.6
Alternativ können Sie für eine Gruppe von Hosts denselben Python-Interpreter wie gezeigt festlegen.
[prod_servers]
192.168.10.1
192.168.10.20
[prod_servers:vars]
ansible_python_interpreter=/usr/bin/python3
Festlegen des Standard-Python-Interpreters in der Ansible-Konfiguration
Um den Standard-Python-Interpreter festzulegen, können Sie die Inventarvariable ansible_python_interpreter in der Hauptkonfigurationsdatei von Ansible /etc/ansible/ansible.cfg festlegen.
sudo vim /etc/ansible/ansible.cfg
Fügen Sie die folgende Zeile unter dem Abschnitt [defaults]
hinzu.
ansible_python_interpreter=/usr/bin/python3
Speichern Sie die Datei und schließen Sie sie.
Versuchen Sie nun noch einmal, den Ansible-Befehl auszuführen:
ansible prod_servers -a "systemctl status firewalld" -u root
Weitere Informationen zu diesem Thema finden Sie unter Python 3-Unterstützung in der offiziellen Ansible-Dokumentation.