Вопрос или проблема
Я использую переходный сервер (сервер A) для доступа к серверу B.
Согласно документации Ansible здесь, у меня есть следующее:
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q [email protected]"'
Сервер B, скажем,: 10.0.2.54
Я запускаю:
ansible-playbook staging.yml -i staging_hosts --private-key=~/.ssh/mykeys.pem -vvvv
Результат:
fatal: [10.0.2.54]: UNREACHABLE! => {"changed": false, "msg": "Все элементы завершены", "results":
[{"item": ["openssl"], "msg": "ОШИБКА! SSH столкнулся с неизвестной ошибкой.
Вывод был:\nOpenSSH_6.2p2, OSSLShim 0.9.8r 8 Дек 2011\ndebug1:
Чтение конфигурационных данных /etc/ssh_config\r\ndebug1: /etc/ssh_config строка 20: Применение опций для *\r\ndebug2:
ssh_connect: needpriv 0\r\ndebug1:
Выполнение прокси-команды: exec ssh -W 10.0.2.54:22 -q ec2- [email protected]\r\ndebug3:
таймаут: 10000 мс остается после подключения\r\ndebug3: Неверный идентификатор RSA1\r\ndebug3:
Не удалось загрузить \"/Users/me/.ssh/mykeys.pem\" как публичный ключ RSA1\r\ndebug1:
постоянно_удалить_suid: 501\r\ndebug1: файл идентификатора /Users/me/.ssh/mykeys.pem типа -1\r\ndebug1:
файл идентификатора /Users/me/.ssh/mykeys.pem-cert типа -1\r\ndebug1:
Включение режима совместимости для протокола 2.0\r\ndebug1:
Строка локальной версии SSH-2.0- OpenSSH_6.2\r\nssh_exchange_identification:
Соединение закрыто удаленным хостом\r\n", "unreachable": true}]}
Может быть, вам нужно определить SSH-ключ для переходного сервера A? Если это так, попробуйте изменить строку аргументов SSH на:
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q -i <путь_к_файлу_ключа_переходного_сервера> [email protected]"'
Ответ или решение
Проблема, с которой вы столкнулись, связана с использованием SSH через прокси (jump host) в Ansible. Судя по вашему сообщению, вы пытаетесь подключиться к серверу B (10.0.2.54) через сервер A, используя указанные параметры подключения. Ошибка, возникающая во время выполнения команды, может быть связана как с настройками SSH, так и с аутентификацией на промежуточном сервере.
Вот несколько шагов, которые помогут вам решить эту проблему:
1. Убедитесь в наличии ключа для промежуточного сервера
Ваше предположение о том, что вам может потребоваться указать ключ SSH для соединения с сервером A, вполне обосновано. Обновите параметры подключения следующим образом:
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q -i ~/.ssh/my_jumphost_key.pem ec2-<username>@<jumphost_ip>"'
Замените ~/.ssh/my_jumphost_key.pem
на путь к вашему приватному ключу для доступа к серверу A, а также ec2-<username>@<jumphost_ip>
на корректные имя пользователя и IP-адрес вашего промежуточного сервера.
2. Убедитесь в доступности сервера A
Выполните команду SSH вручную, чтобы проверить, можете ли вы подключиться к серверу A:
ssh -i ~/.ssh/my_jumphost_key.pem ec2-<username>@<jumphost_ip>
Если соединение не удается установить, проверьте настройки брандмауэра и доступность сервера A.
3. Проверьте доступность и настройки SSH к серверу B
После успешного подключения к серверу A проверьте, сможете ли вы подключиться к серверу B оттуда:
ssh -i ~/.ssh/mykeys.pem <username>@10.0.2.54
4. Информация для отладки
Убедитесь, что файловые права вашего ключа SSH настроены правильно. Он должен быть доступен только для чтения владельцу:
chmod 400 ~/.ssh/mykeys.pem
chmod 400 ~/.ssh/my_jumphost_key.pem
5. Проверка конфигурации SSH
Убедитесь, что в вашем ~/.ssh/config
(если у вас есть этот файл) не настроены параметры, конфликтующие с вашими настройками прокси, так как он может переопределять параметры подключения.
Заключение
После внесения всех изменений попробуйте снова запустить вашу команду Ansible:
ansible-playbook staging.yml -i staging_hosts --private-key=~/.ssh/mykeys.pem -vvvv
Не забудьте заменить ~/.ssh/my_jumphost_key.pem
, <username>
и <jumphost_ip>
на актуальные значения. Если проблема все еще будет возникать, приведите текст новой ошибки для дальнейшего анализа.