Как исправить ошибку Ansible "Общее подключение к x.x.xx закрыто"
В этой короткой статье мы объясним, как решить: "module_stderr": "Общее соединение с x.x.x.x закрыто.\n", "module_stdout": "/bin/sh: /usr/bin/python: Нет такого файла или директории\n", во время выполнения команд Ansible.
На следующем снимке экрана показана ошибка модуля Ansible. Мы столкнулись с этой ошибкой при выполнении команды Ansible для выполнения команд на двух недавно развернутых серверах CentOS 8.
Судя по деталям ошибки, соединение не удалось, потому что оболочка в удаленной системе не смогла найти интерпретатор Python (/usr/bin/python), на что указывает строка: "module_stdout": "/bin/sh: /usr/bin/python: Нет такого файла или каталога\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 inventory в вашем инвентаре /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
Добавьте следующую строку в раздел [по умолчанию]
.
ansible_python_interpreter=/usr/bin/python3
Сохраните файл и закройте его.
Теперь попробуйте запустить команду Ansible еще раз:
$ ansible prod_servers -a "systemctl status firewalld" -u root
Дополнительные сведения по этой теме см. в разделе Поддержка Python 3 в официальной документации Ansible.