Popstas

Записки о Linux

8 Mar 2017, 01:00 - 3 мин читать

Мой процесс написания ansible роли с Molecule и Gitlab CI

Опишу процесс, к которому я пришел на данный момент.

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