Búsqueda de sitios web

Cómo solucionar el error de Ansible "Conexión compartida a x.x.xx cerrada"


En este breve artículo, explicaremos cómo resolver el problema: “module_stderr“: “Conexión compartida a x.x.x.x cerrada.\r\n”, “module_stdout”: “/bin/sh: /usr/ bin/python: No existe tal archivo o directorio\r\n”, mientras se ejecutan los comandos de Ansible.

La siguiente captura de pantalla muestra el error del módulo Ansible. Encontramos este error al ejecutar un comando de Ansible para ejecutar comandos en dos servidores CentOS 8 recién implementados.

Según los detalles del error, la conexión falló porque los shells del sistema remoto no pudieron encontrar el intérprete Python (/usr/bin/python) como se indica en la línea: “module_stdout”: “/bin/sh: /usr/bin/python: No existe tal archivo o directorio\r\n“.

Después de verificar los hosts remotos, descubrimos que los sistemas no tienen Python 2 instalado.

Tienen Python 3 instalado por defecto y su binario es /usr/bin/python3.

Según la documentación de Ansible, Ansible (2.5 y superior) funciona únicamente con la versión 3 de Python y superior. Además, se supone que Ansible detecta y utiliza automáticamente Python 3 en muchas plataformas que lo incluyen.

Sin embargo, si no lo hace, puede configurar explícitamente un intérprete de Python 3 estableciendo la variable de inventario ansible_python_interpreter a nivel de grupo o host en la ubicación de un intérprete de Python 3 como se describe a continuación.

Pasar el intérprete de Python a Ansible en la línea de comandos

Para corregir el error anterior temporalmente, puede usar el indicador -e para pasar el intérprete de Python 3 a Ansible como se muestra.

ansible prod_servers  -e 'ansible_python_interpreter=/usr/bin/python3' -a "systemctl status firewalld" -u root

Configuración del intérprete de Python para Ansible en el inventario

Para corregir el error de forma permanente, configure la variable de inventario ansible_python_interpreter en su inventario /etc/ansible/hosts. Puede abrirlo para editarlo usando el editor de texto v/im o nano como se muestra.

sudo vim /etc/ansible/hosts
OR
vim /etc/ansible/hosts

Agregue la siguiente línea a cada host o hosts de un grupo:

ansible_python_interpreter=/usr/bin/python3

Entonces, las definiciones de sus hosts pueden verse así:

[prod_servers]
192.168.10.1			ansible_python_interpreter=/usr/bin/python3
192.168.10.20			ansible_python_interpreter=/usr/bin/python3.6

Alternativamente, configure el mismo intérprete de Python para un grupo de hosts como se muestra.

[prod_servers]
192.168.10.1		
192.168.10.20		

[prod_servers:vars]
ansible_python_interpreter=/usr/bin/python3

Configuración del intérprete de Python predeterminado en la configuración de Ansible

Para configurar el intérprete de Python predeterminado, puede configurar la variable de inventario ansible_python_interpreter en el archivo de configuración principal de Ansible /etc/ansible/ansible.cfg.

sudo vim /etc/ansible/ansible.cfg

Agregue la siguiente línea debajo de la sección [defaults].

ansible_python_interpreter=/usr/bin/python3

Guarde el archivo y ciérrelo.

Ahora intenta ejecutar el comando Ansible una vez más:

ansible prod_servers -a "systemctl status firewalld" -u root

Para obtener más información sobre este tema, consulte Compatibilidad con Python 3 en la documentación oficial de Ansible.