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.