Опишу процесс, к которому я пришел на данный момент.
TODO: concurrent TODO: несколько дистрибов
Особенности
- Стремление не писать роли
- Постепенное ужесточение требований при написании, от “Лишь бы прошло с 10 раза” к “Скорее всего Travis пройдет с первого раза”
- Тестирование на разных машинах
Поиск роли
Во-первых, я ищу готовую роль. Писать свою роль с нуля я считаю неправильным. При поиске я во-первых иду смотреть, если ли такая роль у geerlingguy или debops. Но роли debops я еще не форкал, слишком они навороченные и зависимые от других debops-ролей.
Критерии выбора роли
- авторитет разработчика роли, какой у него опыт
- количество звездочек
- наличие тестов
- уровень шаблонизации роли (сколько переменных есть в
defaults/main.yml
, а сколько вшито в шаблоны) - обновляемость (пульс проекта), особенно важно для обновляемого и сложного софта, менее важно для базовых ролей
- количество кода, универсальность: если роль популярная и ставится на все системы, есть опасность, что в ней будет много лишнего
Итак, роль найдена и форкнута.
Отладка роли
Converge
При написании роли я пользуюсь в основном molecule converge
- команда создает машину, если ее еще нет,
прогоняет плейбук, больше ничего не делает.
Конечно, в начале роль всегда сломана. Если непонятна причина, я иду внутрь контейнера через molecule login
-
так можно залезть внуть машины и посмотреть, что там пошло не так.
Можно не запуская роль сначала научиться делать правильные действия в контейнере, после чего записать это в виде тасков,
уничтожить контейнер и прогнать заново (molecule test
на этом этапе подходит, хоть он и убьет контейнер, как перед прохождением,
так и после успешного прохождения тестов, можно не волноваться: успешного прохождения скорее всего пока не будет).
Если форкнута нормальная роль, converge
проходится быстро.
Validate
Когда основной сценарий проходит, я запускаю molecule validate
, исправляю ошибки, которые нашел ansible-lint
и помечаю таски,
которые не хочу править, тегом skip_ansible_lint
.
После этого пишу тесты testinfra
(хотя такое у меня бывает редко), проверяю тем же molecule validate
.
Test
В конце перепроверяю все через molecule test
, правлю сломанную идемпотентность, при необходимости вношу правки в .gitlab-ci.yml
и molecule.yml
.
После этого можно проверить сборку, запустив одноразовый раннер локально, это очень удобно, позволяет исключить ошибки на стороне Gitlab CI.
Параметры раннера те же, что и при регистрации на сервере, последним аргументом идет секция из .gitlab-ci.yml
:
gitlab-runner exec docker \
--docker-image popstas/ubuntu-molecule:latest \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
test
На самом деле у меня еще пробрасывается файл 00aptproxy, у меня во всех тестовых сетях стоит apt-cacher-ng
, который позволяет
ускорять прогон ролей и не гонять трафик зря. Об этом подробнее
я писал недавно.
Эта команда создаст раннер с указанным образом и запустит в нем секцию test.
Чтобы в системе появился gitlab-runner
, нужно поставить gitlab-ci-multi-runner
и Docker, больше кажется ничего не надо.
Когда и это сработало, я пушу на внутренний сервер и на Github и жду, что мне ответят два CI. Если после всего это тесты не проходят, матерюсь и ищу косяки на стороне раннера.
Чтобы упростить себе этот процесс, я написал скрипт, который делает следующее:
- ставит тег на последний коммит (bump version), если тег был, удаляет его и ставит на последний коммит
- логинится на dev-сервер, делает оттуда rsync роли с моего компа, прогоняет тесты на gitlab-runner
- если все прошло успешно, делает push на gitlab и github
Выглядит это так: я делаю коммит, вызываю команду вроде role-deploy v1.1.0
и занимаюсь своими делами.
А тем временем роль проходит 3 прогона тестов с разных серверов и попадает во все апстримы, в том числе в galaxy.ansible.com
.
А если не попадает, то все равно избавляет от коммитов типа test: please work!
. Можно повесить это на prepush
хук git,
но мне вручную удобнее запускать.
Dev
Если все прошло успешно, я пишу плейбук для деплоя, накатываю роль на локальную машину, dev-сервера, продакшен сервера (если косяки в роли не могут повлиять на их работу), всего набирается 2-5 машин. После этого в течение 1-2 дней чаще всего находятся недоработки, которые чинятся, после чего роль передеплоится.