Потребовалось мне управлять при помощи 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
в инвентаризационном файле разработчики отказывабтся, мол и в конфиге достаточно.