Ansible: тестируем плейбуки (часть 2)

Итак, в нашей прошлой статье мы рассмотрели как можно быстро и просто настроить среду для тестирования плейбуков и ролей Ansible. Это всё, конечно, очень хорошо и удобно, но почему бы нам не автоматизировать весь процесс внесения изменений в инфраструктуру от написания плейбука до внесения изменений на сервера?

image

Напомню несколько условий, при которых мы будем выполнять тестирование конфигураций:

1. Вся конфигурация хранится в git-репозитории;
2. Jenkins периодически опрашивает git-репозиторий с нашими ролями/плейбуками на предмет внесённых изменений;
3. При появлении изменений Jenkins запускает job с тестированием конфигурации. Тесты состоят из двух этапов:
3.1 Kitchen-CI берёт обновленный код из репозитория, запускает полностью свежий docker-контейнер, заливает в них обновлённые плейбуки из репозитория и запускает Ansible локально, в docker-контейнере;
3.2 Если первый этап прошёл успешно, в docker-контейнере запускается serverspec и проверяет, корректно ли встала новая конфигурация;
4. Если в Kitchen-CI все тесты прошли успешно, то Jenkins инициирует заливку новой конфигурации.

В идеале, весь процесс от написания плейбука и коммита в репозиторий до внесения изменений на сервера, должен проходить без нашего участия. Сильно углубляться в установку Jenkins и подробно расписывать о пайплайнах в данной статье не планируется. Первое делается без проблем из стандартных репозиториев, а второе — сугубо индивидуальное:)

Jenkins

Итак, что же это такое и с чем его едят? Jenkins — это сервис непрерывной интеграции, активно используется для построения и автоматизации процесса разработки от написания кода до выкатки в продакшн. Это достаточно гибкий инструмент с большой историей и обширной поддержкой сообщества. Для него существует неисчисляемое множество плагинов и надстроек. Довожу до вашего сведения, что скоро выйдет версия 2.0. Если мы используем инфраструктуру как код, то почему бы и нам не пойти по этому пути?

Как я упоминал ранее, Jenkins можно поставить из стандартного репозитория (в нашем случае — Debian, но есть репозитории и для других ОС)

sudo apt-get install jenkins

Далее нам необходимо дать для Jenkins возможность запускать kitchen и docker-контейнеры:
Редактируем sudoers:
visudo -f /etc/sudoers.d/jenkins

Даём возможность запускать docker
jenkins ALL=(ALL) NOPASSWD: /usr/bin/docker

Перезапускаем Jenkins:
service jenkins restart

И заходим браузером на дэшборд.

Теперь нам нужно составить сценарий для того чтобы Jenkins делал всю работу за нас. Для начала создадим Item со свободной конфигурацией:

73d76b103926467587d4e35f32c68668.png

В настройках системы контроля версий выбираем git, указываем путь к git-репозиторию и учётные данные для подключения. Если вы храните всю конфигурацию в одном репозитории, то, возможно, будет удобно использовать sparse с указанием папки проекта, который будете тестировать и деплоить.

ff63ca224f6c477f81c3ddebd3f63c2f.png

В триггерах сборки указываем периодически опрашивать SCM и устанавливаем интервал с которым будем опрашивать наш git. В этом случае следующие шаги задачи будут начинаться только если в репозиторий были внесены изменения.

Далее, в шагах сбоки указываем «Выполнение команды shell» и просто указываем шаги, которые необходимы для запуска теста плейбука и разливки:

sudo kitchen test

На этом этапе kitchen-ci запускает наши docker-контейнеры, запускает Ansible с плейбуком локально, затем запускает внутри контейнера serverspec. При желании шаги можно разделить на converge и verify.
ansible-playbook site.yml

Запускает разливку конфигурации, указанной в роли/плейбуке. Последний шаг, также, по желанию. Кто-то может не доверять машине разливать конфигурацию и делать это вручную при условии, что тесты прошли успешно. Для этого можно установить плагин для отсылки уведомления (e-mail, IRC, XMPP, благо их там много) и добавить post-build action. Таким образом, после тестов будет отправлено уведомление об удачной или неудачной сборке.

Спасибо за внимание. Удачных тестов и автоматизации!
Автор: DevOps-администратор Southbridge — Виктор Батуев.

Ссылки


Ansible
Jenkins
Kitchen-CI
Serverspec

Комментарии (1)

  • 6 июля 2016 в 10:06

    0

    Вы понимаете, что смысл этой статьи сводится к
    1) А вот есть Jenkins
    2) А вот Jenkins умеет пуллить изменения в гите
    3) А вот можно затолкать скрипт в дженкинс — и это будет работать
    ?

© Habrahabr.ru