Ansible — отличный инструмент управления сервером.
Вместе с git он позволяет перейти к парадигме развертывания как кода со всеми вытекающими из этого прелестями, такими как ревью кода, мерж (pull) запросы на изменение и тому подобное.
Особенно это актуально, если над этим работает команда, а не один человек.
В этом свете становится очевидно удобным хранить настройки подключения для управляемых хостов непосредственно в этом же репозитории, помимо файла Inventory/hosts (его вообще лучше переместить в какой-нибудь сервис типа CMDBuild или аналогичный).
То есть, если, скажем, на хосте изменился порт подключения или IP-адрес, остальная часть команды должна получить это при следующем извлечении изменений из репозитория, а не каждый раз вносить изменения в свой ~/.
ssh/ файл конфигурации.
Более того, большинство параметров будут работать корректно без каких-либо усилий, но не все так просто, если вы хотите использовать ssh-туннели.
Итак, предположим, что мы сохранили конфиг в файл Inventory/ssh.config. Он содержит основные подключения и базовые настройки:
И так далее, все стандартно, как мы обычно прописываем в пользовательском конфиге.Host * IdentityFile /secret/id_rsa User wheel Host host.one HostName 1.2.3.4 User ant Host host.two HostName 2.3.4.5 Port 2022
Ansible.cfg предложит вам указать его относительный путь, используя опцию -F: ssh_args = -o ControlMaster=auto -o ControlPersist=60s -F inventory/ssh.config
Это позволит каждому просто клонировать репозиторий и сразу приступить к работе без настройки своей машины и доступа (конечно, стоит где-то взять приватные ключи доступа, в общем, хранить их здесь не рекомендуется, хотя если репозитории в команде являются частными, это тоже можно учитывать).
Большинство опций тогда будут работать, однако если вы попытаетесь использовать туннели, примерно так: Host organization.gateway
HostName 1.2.3.4
Host inner.host
HostName 2.3.4.5
ProxyCommand ssh organization.gateway -W %h:%p
Вы сразу получите ошибку, что не можете подключиться к хосту Internal.host! Как же так?
На самом деле это просто.
При подключении Ansible просто вызывает двоичный файл ssh и передает ему указанные параметры.
Далее здесь указывается туннель; ssh разветвит его и вызовет указанную команду как есть.
Кстати, это может быть nc или переадресация портов с помощью iptables (firewalld).
То есть никакой интерпретации не делается.
А это значит, что будет вызвана команда: ssh organization.gateway -W %h:%p
И вообще, ssh не сможет установить соединение, потому что не знает, что такое Organization.gateway. Конечно, мы могли бы исправить эту ситуацию, указав здесь путь к файлу: Host inner.host
HostName 2.3.4.5
ProxyCommand ssh -F /path/to/same/ssh.config organization.gateway -W %h:%p
Это сработает, но мы хотели не привязываться к пути на конкретной машине, а хранить универсальный для всех файл!
Частичным решением проблемы было бы указание относительного пути, но это решает ее лишь частично, если вы хотите вызвать ansible, используя абсолютный путь из другого каталога.
Т.
к.
ssh не предусматривает никакого наследования конфигов, то для bash (sh тоже должен работать в sh, для других можно немного модифицировать) мы можем просто эмулировать это: Host inner.host
HostName 2.3.4.5
ProxyCommand ssh $( egrep -z -A1 '^-F$' /proc/$PPID/cmdline ) organization.gateway -W %h:%p
Все, что мы изменили, мы поставили» $( egrep -z -A1 '^-F$' /proc/$PPID/cmdline ) » и вся магия произойдет здесь.
А это значит, что это просто «тот самый конфиг, с которым вызывался основной ssh-процесс».
Работает это просто: значение опции -F подставляется под порожденный процесс, который извлекается из вызывающих опций.
Теги: #Системное администрирование #Администрирование серверов #DevOps #ansible #ssh #ssh туннель
-
Преимущества Клавиатур И Чехлов Для Ipad 2
19 Oct, 24 -
Как Стать Тестировщиком С Нуля
19 Oct, 24 -
«Как» Против «Как Сделать»
19 Oct, 24 -
Изменение Доли Браузеров С Мая По Июнь
19 Oct, 24 -
Каталог Квестов В Реальности В Москве
19 Oct, 24 -
Дуцюй – Злобная Матрешка
19 Oct, 24 -
Белорусы Создают Систему Поиска Коллег
19 Oct, 24