Pesquisa de site

Como corrigir o erro Ansible “Conexão compartilhada com x.x.xx fechada”


Neste breve artigo, explicaremos como resolver: “module_stderr“: “Conexão compartilhada com x.x.x.x fechada.\r\n”, “module_stdout”: “/bin/sh: /usr/ bin/python: Arquivo ou diretório inexistente\r\n”, ao executar comandos Ansible.

A captura de tela a seguir mostra o erro do módulo Ansible. Encontramos esse erro ao executar um comando Ansible para executar comandos em dois servidores CentOS 8 recém-implantados.

A partir dos detalhes do erro, a conexão falhou porque os shells no sistema remoto não conseguiram encontrar o interpretador Python (/usr/bin/python) conforme indicado por a linha: “module_stdout”: “/bin/sh: /usr/bin/python: Arquivo ou diretório inexistente\r\n“.

Após verificar os hosts remotos, descobrimos que os sistemas não possuem o Python 2 instalado.

Eles têm o Python 3 instalado por padrão e seu binário é /usr/bin/python3.

De acordo com a documentação do Ansible, Ansible (2.5 e superior) funciona apenas com Python versão 3 e superior. Além disso, o Ansible deve detectar e usar automaticamente o Python 3 em muitas plataformas que o acompanham.

No entanto, se isso não acontecer, você poderá configurar explicitamente um intérprete Python 3 definindo a variável de inventário ansible_python_interpreter em um nível de grupo ou host para o local de um intérprete Python 3, conforme descrito abaixo.

Passando o interpretador Python para Ansible na linha de comando

Para corrigir o erro acima temporariamente, você pode usar o sinalizador -e para passar o interpretador Python 3 para Ansible conforme mostrado.

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

Configurando o interpretador Python para Ansible no inventário

Para corrigir o erro permanentemente, defina a variável de inventário ansible_python_interpreter em seu inventário /etc/ansible/hosts. Você pode abri-lo para edição usando o editor de texto v/im ou nano conforme mostrado.

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

Anexe a seguinte linha a cada host ou hosts de um grupo:

ansible_python_interpreter=/usr/bin/python3

Portanto, as definições dos seus hosts podem ser assim:

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

Como alternativa, defina o mesmo interpretador Python para um grupo de hosts conforme mostrado.

[prod_servers]
192.168.10.1		
192.168.10.20		

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

Configurando o interpretador Python padrão na configuração Ansible

Para definir o interpretador Python padrão, você pode definir a variável de inventário ansible_python_interpreter no arquivo de configuração principal do Ansible /etc/ansible/ansible.cfg.

sudo vim /etc/ansible/ansible.cfg

Adicione a seguinte linha na seção [defaults].

ansible_python_interpreter=/usr/bin/python3

Salve o arquivo e feche-o.

Agora tente executar o comando Ansible mais uma vez:

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

Para obter mais informações sobre este tópico, consulte Suporte ao Python 3 na documentação oficial do Ansible.