Вопрос или проблема
Я создал кластер и пытаюсь подключиться к главному узлу с другого сервера Ansible. Я скопировал ssh-ключ на главный сервер и могу подключиться к нему с помощью следующей команды с сервера Ansible:
ssh -i ~/.ssh/id_rsa [email protected]
но я не могу подключиться с помощью
sudo ansible-playbook -i hosts /etc/ansible/playbook/test.yml
И я получил эту ошибку.
x.x.x.x | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host x.x.x.x port 22: Connection timed out\r\n", "unreachable": true }
Можете помочь мне, пожалуйста? Другие проблемы с сервером не помогли мне.
Примечание:
x.x.x.x (это IP главного узла)
PLAY [nodes] ***************************************************************************************************************** TASK [Gathering Facts] *******************************************************************************************************
ok: [t.t.t.t]
fatal: [x.x.x.x]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host x.x.x.x port 22: Connection timed out\r\n", "unreachable": true}
TASK [test] *********************************************************************************
PLAY RECAP *******************************************************************************************************************
x.x.x.x : ok=0 changed=0 unreachable=1 failed=0
t.t.t.t : ok=1 changed=0 unreachable=0 failed=1```
Команда ansible-playbook, вероятно, не удается из-за того, что путь к ssh-ключу не определен.
Ansible рекомендует использовать ssh-agent:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
Другой способ добавить файлы закрытых ключей без использования ssh-agent — это использовать ansible_ssh_private_key_file в инвентарном файле, как объяснено здесь
https://docs.ansible.com/ansible/latest/user_guide/connection_details.html
Маловероятно, но проблема может быть в разрешениях для вашего ключа. Попробуйте следующую команду:
cat ~/.ssh/id_rsa.pub | ssh @ “mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys”
Это всегда помогает мне с ansible.
Прежде всего, вам нужно установить привилегии для частного ключа на вашем сервере ansible:
sudo chmod 600 id_rsa
Проверьте, что вы скопировали открытый ключ на управляемый узел:
sudo chmod 700 id_rsa.pub
Убедитесь, что ваш инвентарный файл правильно настроен с правильным IP-адресом
Проверьте ваш файл sshd_config на управляемом узле, возможно, есть проблемы
Перезапустите ssh сервер как на основном сервере ansible, так и на управляемом узле
Согласно вашему тесту соединения, вы используете ssh ...
(предполагается, что ключи настроены правильно), вы запускаете playbook ansible с помощью sudo
, это может быть причиной…
Я бы рекомендовал НЕ использовать sudo
вообще, так как Ansible этого не требует, и ваш root
пользователь может иметь конфигурацию, отличную от вашей, поэтому попробуйте то же самое без sudo
, это должно сработать
Ответ или решение
Ошибка, с которой вы столкнулись при попытке подключения к узлу через Ansible, возникает при невозможности установить SSH-соединение с удалённым хостом, в данном случае с "master node". Это связано с тем, что Ansible не может подключиться к указанному IP-адресу. Давайте разберём возможные причины и предложим несколько решений для устранения этой проблемы.
Теория (Theory)
Когда Ansible осуществляет подключение к удалённому узлу, он использует SSH для аутентификации и взаимодействия. Если SSH-клиент работает корректно при ручном подключении, это означает, что ключи и конфигурация SSH настроены правильно. Однако при использовании Ansible возможны некоторые дополнительные настройки, которые должны быть проверены и исправлены:
-
SSH-ключи. Ansible должен знать, какой приватный ключ использовать для подключения. Это может быть настраиваемо через SSH-агент или прямо в инвентаре Ansible.
-
Конфигурация SSH сервера на удалённом узле (sshd_config). Возможно, что настройки SSH на удалённом хосте неправильно настроены или SSH-деймон не работает.
-
Права доступа. Права доступа к SSH-ключам и директориям на локальной и удалённой машинах могут повлиять на возможность подключения.
-
Сетевые проблемы. Убедитесь, что порты открыты и сеть между машинами функционирует корректно.
Пример (Example)
В вашем случае, вы смогли подключиться через команду SSH из командной строки:
ssh -i ~/.ssh/id_rsa [email protected]
Это говорит о том, что SSH-ключ был правильно скопирован на удалённую машину и конфигурация SSH с вашей стороны корректна для ручного подключения.
Однако при запуске Ansible-playbook:
sudo ansible-playbook -i hosts /etc/ansible/playbook/test.yml
Вы столкнулись с ошибкой подключения:
x.x.x.x | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host x.x.x.x port 22: Connection timed out", "unreachable": true }
Это может указывать на проблему с сетевыми настройками, конфигурацией соединений в Ansible, или правами на доступ к файлам ключей.
Применение (Application)
-
Проверка SSH-агента:
- Убедитесь в том, что ваш SSH-ключ добавлен в SSH-агент:
ssh-agent bash ssh-add ~/.ssh/id_rsa
Это поможет Ansible использовать нужный ключ для подключения.
-
Использование ansible_ssh_private_key_file:
- Вы можете явно указать SSH-ключ в вашем инвентаре Ansible, добавив следующее к конфигурации вашего хоста в файле inventory:
[master] x.x.x.x ansible_ssh_private_key_file=~/.ssh/id_rsa
-
Проверка конфигурации SSH и прав:
-
Убедитесь, что файл
sshd_config
на удалённом узле правильно настроен. Например, убедитесь, что разрешены нужные алгоритмы шифрования и порты. -
Проверьте права доступа к SSH-ключам:
sudo chmod 600 ~/.ssh/id_rsa sudo chmod 644 ~/.ssh/id_rsa.pub
Это предотвратит возможные проблемы с доступом к ключам.
-
-
Не используйте sudo:
- Попробуйте выполнить Ansible playbook без использования
sudo
, так как это может вызывать проблемы с конфигурацией SSH:
ansible-playbook -i hosts /etc/ansible/playbook/test.yml
- Попробуйте выполнить Ansible playbook без использования
-
Сетевая проверка:
- Проверьте наличие открытности порта 22 на вашем маршрутизаторе и наличие связи по этому порту между машинами.
-
Перезапуск SSH:
- Перезапустите SSH-демон на обеих машинах для гарантии наличия всех изменений:
sudo systemctl restart ssh
Следуя этим шагам, вы увеличите шансы на успешное подключение через Ansible и сможете диагностировать и устранить проблему. Если проблема сохраняется, проверьте логи SSH на проблемной машине для получения более подробной информации о возможности отказов подключения.