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 xxxx cerrada. \ R \ n", "module_stdout": "/ bin/sh:/usr/bin/python: No existe tal archivo o directorio \ r \ n ”, mientras ejecuta comandos 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 \ 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.

De acuerdo con 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

Por lo tanto, 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.