Итак, в нашей прошлой статье мы рассмотрели как можно быстро и просто настроить среду для тестирования плейбуков и ролей 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 со свободной конфигурацией:



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



В триггерах сборки указываем периодически опрашивать 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
Поделиться с друзьями
-->

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


  1. bhavenger
    06.07.2016 10:06
    +4

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


    1. welcomerooot
      06.07.2016 13:23

      Всё верно, просто показали один из способов использования Jenkins


  1. tgz
    06.07.2016 11:44

    Это все хорошо пока вам не надо тестировать какой-нибудь хитрый кластер из пачки разных серверов.


    1. welcomerooot
      06.07.2016 13:24
      +2

      Да, этот способ подходит только для отдельных ролей/плейбуков.


  1. D1abloRUS
    06.07.2016 13:15

    В сторону gitlab + docker не смотрели?


    1. welcomerooot
      06.07.2016 17:05

      Нет, но попробую ознакомиться, когда будет свободное время.


  1. d3vil_st
    06.07.2016 16:23

    Jenkins имеет плагин для Ansible, с ним всё становится еще лучше.


  1. AlexGluck
    06.07.2016 17:34

    jenkins ALL=(ALL) NOPASSWD: /usr/bin/docker
    за это руки оторвать.


  1. dostigai
    06.07.2016 20:39
    +3

    Спасибо ребята! Продолжайте писать в том же ритме. Практика — это большое дело.