Поиск по сайту:

Как исправить ошибку Ansible «Общее соединение с x.x.xx закрыто»


В этой короткой статье мы объясним, как решить проблему: «module_stderr»: «Общее соединение с x.x.x.x закрыто.\r\n», «module_stdout»: «/bin/sh: /usr/ bin/python: нет такого файла или каталога\r\n», при выполнении команд Ansible.

На следующем снимке экрана показана ошибка модуля Ansible. Мы столкнулись с этой ошибкой при запуске команды Ansible для выполнения команд на двух недавно развернутых серверах CentOS 8.

Судя по подробностям ошибки, соединение не удалось, поскольку оболочки в удаленной системе не смогли найти интерпретатор Python (/usr/bin/python), как указано в строка: «module_stdout»: «/bin/sh: /usr/bin/python: Нет такого файла или каталога\r\n».

Проверив удаленные хосты, мы обнаружили, что в системах не установлен Python 2.

По умолчанию у них установлен Python 3, а его двоичный файл — /usr/bin/python3.

Согласно документации Ansible, Ansible (2.5 и выше) работает только с Python версии 3 и выше. Кроме того, Ansible должен автоматически обнаруживать и использовать Python 3 на многих платформах, которые поставляются с ним.

Однако если это не удается, вы можете явно настроить интерпретатор Python 3, задав для инвентарной переменной ansible_python_interpreter на уровне группы или хоста местоположение интерпретатора Python 3, как описано ниже.

Передача интерпретатора Python в Ansible из командной строки

Чтобы временно исправить вышеуказанную ошибку, вы можете использовать флаг -e для передачи интерпретатора Python 3 в Ansible, как показано.

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

Настройка интерпретатора Python для Ansible в инвентаре

Чтобы навсегда исправить ошибку, установите переменную инвентаря ansible_python_interpreter в вашем инвентаре /etc/ansible/hosts. Вы можете открыть его для редактирования с помощью текстового редактора v/im или nano, как показано на рисунке.

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

Добавьте следующую строку к каждому хосту или хостам в группе:

ansible_python_interpreter=/usr/bin/python3

Итак, определения ваших хостов могут выглядеть так:

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

Альтернативно, установите один и тот же интерпретатор Python для группы хостов, как показано.

[prod_servers]
192.168.10.1		
192.168.10.20		

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

Настройка интерпретатора Python по умолчанию в конфигурации Ansible

Чтобы установить интерпретатор Python по умолчанию, вы можете установить переменную инвентаризации ansible_python_interpreter в основном файле конфигурации Ansible /etc/ansible/ansible.cfg.

sudo vim /etc/ansible/ansible.cfg

Добавьте следующую строку в раздел [defaults].

ansible_python_interpreter=/usr/bin/python3

Сохраните файл и закройте его.

Теперь попробуйте запустить команду Ansible еще раз:

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

Дополнительные сведения по этой теме см. в разделе Поддержка Python 3 в официальной документации Ansible.