Jak naprawić błąd Ansible „Połączenie współdzielone z x.x.xx zamknięte”.
W tym krótkim artykule wyjaśnimy, jak rozwiązać problem: „module_stderr”: „Współdzielone połączenie z x.x.x.x zamknięte.\r\n”, „module_stdout”: „/bin/sh: /usr/ bin/python: Brak takiego pliku lub katalogu\r\n” podczas uruchamiania poleceń Ansible.
Poniższy zrzut ekranu pokazuje błąd modułu Ansible. Napotkaliśmy ten błąd podczas uruchamiania polecenia Ansible w celu wykonania poleceń na dwóch nowo wdrożonych serwerach CentOS 8.
Ze szczegółów błędu wynika, że połączenie nie powiodło się, ponieważ powłoki w systemie zdalnym nie mogły znaleźć interpretera Python (/usr/bin/python), jak wskazuje wiersz: „module_stdout”: „/bin/sh: /usr/bin/python: Nie ma takiego pliku ani katalogu\r\n”.
Po sprawdzeniu zdalnych hostów odkryliśmy, że systemy nie mają zainstalowanego Pythona 2.
Domyślnie mają zainstalowany Python 3, a jego plik binarny to /usr/bin/python3.
Zgodnie z dokumentacją Ansible, Ansible (2.5 i nowsze) działa tylko z Pythonem w wersji 3 i nowszych. Ponadto Ansible powinien automatycznie wykrywać i używać Pythona 3 na wielu platformach, które są z nim dostarczane.
Jeśli jednak to się nie powiedzie, możesz jawnie skonfigurować interpreter Pythona 3, ustawiając zmienną inwentarzową ansible_python_interpreter na poziomie grupy lub hosta na lokalizację interpretera Pythona 3, jak opisano poniżej.
Przekazywanie interpretera Pythona do Ansible w wierszu poleceń
Aby tymczasowo naprawić powyższy błąd, możesz użyć flagi -e
, aby przekazać interpreter Pythona 3 do Ansible, jak pokazano.
ansible prod_servers -e 'ansible_python_interpreter=/usr/bin/python3' -a "systemctl status firewalld" -u root
Ustawianie interpretera Pythona dla Ansible w ekwipunku
Aby trwale naprawić błąd, ustaw zmienną inwentarzową ansible_python_interpreter w zasobach /etc/ansible/hosts. Można go otworzyć do edycji za pomocą edytora tekstu v/im lub nano, jak pokazano.
sudo vim /etc/ansible/hosts
OR
vim /etc/ansible/hosts
Dołącz następujący wiersz do każdego hosta lub hostów w grupie:
ansible_python_interpreter=/usr/bin/python3
Zatem definicje hostów mogą wyglądać następująco:
[prod_servers]
192.168.10.1 ansible_python_interpreter=/usr/bin/python3
192.168.10.20 ansible_python_interpreter=/usr/bin/python3.6
Alternatywnie ustaw ten sam interpreter Pythona dla grupy hostów, jak pokazano.
[prod_servers]
192.168.10.1
192.168.10.20
[prod_servers:vars]
ansible_python_interpreter=/usr/bin/python3
Ustawianie domyślnego interpretera języka Python w konfiguracji Ansible
Aby ustawić domyślny interpreter Pythona, możesz ustawić zmienną inwentarzową ansible_python_interpreter w głównym pliku konfiguracyjnym Ansible /etc/ansible/ansible.cfg.
sudo vim /etc/ansible/ansible.cfg
Dodaj następujący wiersz w sekcji [defaults]
.
ansible_python_interpreter=/usr/bin/python3
Zapisz plik i zamknij go.
Teraz spróbuj jeszcze raz uruchomić polecenie Ansible:
ansible prod_servers -a "systemctl status firewalld" -u root
Więcej informacji na ten temat można znaleźć w sekcji Obsługa języka Python 3 w oficjalnej dokumentacji Ansible.