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


En este breve artículo, explicaremos cómo resolver: “module_stderr”: “Conexión compartida a x.x.x.x cerrada. "," Module_stdout ":"/bin/sh:/usr/bin/python: No existe tal archivo o directorio ”, 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 Ansible para ejecutar comandos en dos servidores CentOS 8 recientemente implementados.

A partir de los detalles del error, la conexión falló porque los shell (s) en el sistema remoto no pudieron encontrar el intérprete de Python (/ usr/bin/python) como lo indica la línea: "module_stdout": "/ bin/sh:/usr/bin/python: no existe tal archivo o directorio “.

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 solo con la versión 3 de Python y superior. Además, se supone que Ansible detecta y usa 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 en un 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 la marca -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 intente 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 la compatibilidad con Python 3 en la documentación oficial de Ansible.