Вопреки замыслу разработчиков и бесчисленных тьюториалов, внедрять Ansible начинают когда инфраструктура уже разрослась. Непомерно. Настолько, что руками это хозяйство уже не удержать. Вы освоили азы формирования inventory, уверенно научились делать «-m ping», и даже познали, что в новой папке надо сделать «ansible-galaxy role init». И пришло время применить все эти навыки на практике.
Перед вами раскинулась существующая инфраструктура во всей красе! Виртуалки размножались почкованием, сервисы черенкованием и самосевом. А вам надо в этом зоопарке найти способ сколько-нибудь централизованного управления хозяйством.
Обычно на этом внедрение Ansible заканчивается. В стабильных и растущих конторах неспешно, но оперативно берут на работу еще одну штатную единицу и процесс уходит на следующий виток.
Ключ на старт
Первым делом надо обеспечить доступ ко всем обслуживаемым хостам. То есть, разложить ключ.
Подготовим два inventory. В первом у нас будет структурированное описание нашей инфраструктуры, и в дальнейшем он и будет использоваться при эксплуатации. Второй - временный, будет содержать существующие реквизиты доступа к хостам. Да-да, я в курсе, что можно без него обойтись, и терпеливо несколько раз применить playbook с параметрами «--ask-pass --ask-become-pass». Согласно тьюториалам благодаря идемпотенции рано или поздно мы покроем все хосты. Но дьявол кроется в деталях — мы же продвинутые DevSecOps, поэтому даже непричесанная инфраструктура щедро снабжена «sshguard» и прочими «fail2ban». А значит, у нас право всего на одну-три ошибки. И процесс развертывания может превратиться в бесконечный. Причем, начиная с четвертого запуска у вас не будет возможности понять — вы ошиблись в реквизитах или уже улетели в бан.
Предварительная
Отлаживать playbook будем на локальном полигоне.
Для чистоты эксперимента на втором и третьем миньонах удалим наш ключ, создадим новых пользователей и назначим различные пароли (root тоже). Я буду использовать пример для Debian, но все последующее в той или иной мере применимо для любых платформ. На основе этой информации сделаем второй inventory.
Здесь уже нет необходимости указывать адрес хоста — Ansible возьмет его из первого inventory. И, не мучайтесь угрызениями совести - вам все равно эти пароли передали по почте (мессенджеру) или прокричали через всю комнату. Это временный inventory, он долго не проживет.
Промежуточная
Имя текущего пользователя (который запустил playbook) для удобства занесем в переменную. Собираем ssh ключи хостов, чтобы не бороться с запросом на проверку fingerprint. Зачем при этом применяется волшебное слово «throttle» я объяснил в статье про полигон. Параноики помнят про MitM и сделали это предварительно руками, убедившись в совпадении. Создаем на хостах своего пользователя. Убеждаемся, что в домашней директории есть «.ssh», и кладем туда свой ключ.
Одна из особенностей Ansible заключается в том, что он любые строки любой ценой пытается на всякий случай запихнуть в «Jinja2». Поэтому в «name» также можно использовать переменные, и даже магические конструкции.
Главная
Поскольку для административных целей нам понадобится делать «become», ставим на хост «sudo» и записываем себя в соответствующий «drop-in» файл. Параноики пропускают этот момент и держат в голове необходимость каждый раз вводить «--ask-become-pass», и, в чем-то будут правы.
Запускаем сразу с двумя inventory.
$ ansible-playbook ansinit.yml -i playground.yml -i temp_inventory.yml
Запускаем еще раз. И еще раз, но уже с одним inventory полигона.
$ ansible-playbook ansinit.yml -i playground.yml
Если здесь все обошлось без ошибок — ключ успешно закрепился на хостах.
Подъем!
Осталось заменить inventory на боевые и применить playbook на инфраструктуре.
Возможно, при составлении inventory доступов вы ошибетесь в заданных реквизитах. Как добавить Ansible интерактивности и заставить его спросить недостающие части я расскажу в следующей статье.
Ну, и, конечно, нужно убрать с дороги грабли — на некоторых хостах может не оказаться Python. Достаточно после сбора ключей добавить «ping» и установку Python. Для Debian это будет, например, так:
Вместо заключения
Не забудьте финальным шагом удалить временный inventory с реквизитами доступа — безопасность превыше всего.
Код этого playbook для изучения вы можете скачать по ссылке https://gitflic.ru/project/wingedfox/dzen-ansible/file/?file=ansinit&branch=master из моего репозитория.