Ansible и подключение через промежуточный хост.

Потребовалось мне управлять при помощи Ansible серверами, у которых ssh доступен только во внутренней сети заказчика через подконтрольный мне сервер, который доступен через Интернет. Вариант на трёх или четырёх, как я их называю, центральных серврах поднимать Ansible и синхронизировать playbooks мне как-то не улыбалась. Решил поинтересоваться, как народ эту задачу решает при помощи Ansible, установленного на одной машине. В интернете много вопросов на эту тему. Ответов нормальных на этот вопрос я не нашёл. А вот мысль одна у меня в голове крутилась давно: ProxyCommand. В итоге занялся расширением своих познаний о ssh.
Оказалось, что ProxyCommand – это то что нужно!
Для получения желаемого результата достаточно было “подкрутить” ssh_args в ansible.conf и указать, что подключаться к машинам и списка хостов надо используя промежуточный хост:
-o ProxyCommand="ssh -q -A -x root@xxx.xxx.xxx.xxx -p 2022 -W %h:22,
где xxx.xxx.xxx.xxx – IP того самого подконтрольного сервера. Остальные ключи и параметры подробно описаны в man 1 ssh.
Как видно, тут есть одно ограничение – у опрашиваемых серверов sshd должен слушть на 22 порту (или каком-то другом), лишь бы у всех одинаковый был.
Для работоспособности этой схемы надо соблюсти некоторые условия:
– на центральном сервере и дирижируемых хостах надо в authorized_keys добавить открытый ключ учётной записи от имени которой запускается Ansible.
– в /etc/ssh/sshd на центральном сервере значение MaxSessions должно быть больше, чем значение forks в ansible.cfg, чтобы sshd не отбрасывал соединения.
А теперь небольшая ложка дёгтя. ssh_args нельзя указать в файле инвентаризации, так что для каждого случая с центральным сервером понадобится отдельный конфигурационный файл ansible.cfg. В нём можно указать путь к инвентаризационному файлу со списком внутренних IP дирижируемых хостов. Запускать ansible придётся с указанием переменной окружения ANSIBLE_CONFIG=/etc/ansible/ansible_intnet1.cfg.
Как показал дальнейший поиск, добавлять возможность указания ssh_args в инвентаризационном файле разработчики отказывабтся, мол и в конфиге достаточно.

Share