Hoe u de Ansible-fout 'Gedeelde verbinding met x.x.xx gesloten' kunt oplossen
In dit korte artikel leggen we uit hoe je het probleem kunt oplossen: “module_stderr“: “Gedeelde verbinding met x.x.x.x gesloten.\r\n”, “module_stdout”: “/bin/sh: /usr/ bin/python: No such file or directory\r\n”, terwijl Ansible-opdrachten worden uitgevoerd.
De volgende schermafbeelding toont de Ansible-modulefout. We zijn deze fout tegengekomen tijdens het uitvoeren van een Ansible-opdracht om opdrachten uit te voeren op twee nieuw geïmplementeerde CentOS 8-servers.
Uit de foutdetails blijkt dat de verbinding mislukte omdat de shell(s) in het externe systeem de Python-interpreter (/usr/bin/python) niet konden vinden, zoals aangegeven door de regel: “module_stdout”: “/bin/sh: /usr/bin/python: Bestand of map bestaat niet\r\n“.
Nadat we de externe hosts hadden gecontroleerd, ontdekten we dat op de systemen Python 2 niet is geïnstalleerd.
Ze hebben Python 3 standaard geïnstalleerd en het binaire bestand is /usr/bin/python3.
Volgens de Ansible-documentatie werkt Ansible (2.5 en hoger) alleen met Python versie 3 en hoger. Bovendien wordt Ansible verondersteld Python 3 automatisch te detecteren en te gebruiken op veel platforms die ermee worden meegeleverd.
Als dit echter niet lukt, kunt u expliciet een Python 3-interpreter configureren door de inventarisvariabele ansible_python_interpreter op groeps- of hostniveau in te stellen op de locatie van een Python 3-interpreter, zoals hieronder beschreven.
Python-interpreter doorgeven aan Ansible op de opdrachtregel
Om de bovenstaande fout tijdelijk op te lossen, kunt u de vlag -e
gebruiken om de Python 3-interpreter door te geven aan Ansible, zoals weergegeven.
ansible prod_servers -e 'ansible_python_interpreter=/usr/bin/python3' -a "systemctl status firewalld" -u root
Python-interpreter voor Ansible instellen in de inventaris
Om de fout permanent op te lossen, stelt u de inventarisvariabele ansible_python_interpreter in uw inventaris /etc/ansible/hosts in. U kunt het openen voor bewerking met de v/im- of nano-teksteditor, zoals weergegeven.
sudo vim /etc/ansible/hosts
OR
vim /etc/ansible/hosts
Voeg de volgende regel toe aan elke host of hosts in een groep:
ansible_python_interpreter=/usr/bin/python3
De definities van uw hosts kunnen er dus als volgt uitzien:
[prod_servers]
192.168.10.1 ansible_python_interpreter=/usr/bin/python3
192.168.10.20 ansible_python_interpreter=/usr/bin/python3.6
U kunt ook dezelfde Python-interpreter instellen voor een groep hosts, zoals weergegeven.
[prod_servers]
192.168.10.1
192.168.10.20
[prod_servers:vars]
ansible_python_interpreter=/usr/bin/python3
Standaard Python-interpreter instellen in Ansible-configuratie
Om de standaard Python-interpreter in te stellen, kunt u de inventarisvariabele ansible_python_interpreter instellen in het hoofdconfiguratiebestand /etc/ansible/ansible.cfg van Ansible.
sudo vim /etc/ansible/ansible.cfg
Voeg de volgende regel toe onder de sectie [defaults]
.
ansible_python_interpreter=/usr/bin/python3
Sla het bestand op en sluit het.
Probeer nu het Ansible-commando nogmaals uit te voeren:
ansible prod_servers -a "systemctl status firewalld" -u root
Zie Python 3-ondersteuning in de officiële Ansible-documentatie voor meer informatie over dit onderwerp.