# Ansible Semaphore

<https://habr.com/ru/articles/645927/>

CI/CD стал неотъемлемой частью процесса разработки ПО, как в крупных, так и в небольших компаниях и проектах, в том числе open source.

Самыми популярными CI/CD-системами является [GitLab](https://habr.com/company/gitlab) и Jenkins. Обе эти системы являются мощными, расширяемыми и включают множество дополнительных возможностей. С помощью этих систем можно построить CI/CD любой сложности.

Но часто бывает, особенно на небольших проектах, что необходимо максимально простое и прямолинейное решение, а не функциональность. В этом случае [Ansible Semaphore](https://ansible-semaphore.com/) является хорошей альтернативой GitHub и Jenkins.

Ansible Semaphore – это веб-интерфейс для запуска Ansible-сценариев с зачатками CI/CD. С помощью него можно превратить [плейбук](https://habr.com/ru/company/southbridge/blog/569172/) в простую CI/CD систему. Это open source проект, он развивается с 2015 года и на данный момент у него 5200 звезд на GitHub.

Интерфейс Ansible Semaphore напоминает интерфейс Jenkins и AWX. Описание интерфейса можно найти в [документации](https://docs.ansible-semaphore.com/).

Далее предполагается что читатель знаком с Ansible.

Так как предполагается небольшой проект, то возьмем модель разработки [Trunk](https://habr.com/ru/post/519314/). В отличие от Git-flow такая модель предполагает одну и ту же ветвь для разработки и для продакшна. Это сильно упрощает CI/CD.

Наш pipeline будет выглядеть так:

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-e32ce28962d1a4d84d6fe069c621dd4759fe9f7d%2F255c682350d03dca9d0d3ad689e55e97.png?alt=media)

Все элементы схемы легко реализуются на Ansible. А благодаря версионированию и вызову задач по расписанию, все это будет работать автоматически.

## Создадим репозиторий на GitHub

Нам потребуется два плейбука и соответствующие роли для них:

* `build.yml` – для сборки приложения и отправки его в S3-хранилище.
* `deploy.yml` – для доставки приложения на сервера dev- и production-окружения.

Вот исходный код: [github.com/fiftin/ansible-semaphore-deploy-test](https://github.com/fiftin/ansible-semaphore-deploy-test).

## Интерфейс Ansible Semaphore

[intuitive-ui.mp4](https://ansible-semaphore.com/img/intuitive-ui.mp4)

Для тех кто знаком с AWX, интерфейс будет понятен. Для остальных коротко расскажу. Интерфейс имеет следующие ключевые сущности:

* *Задача (Task)* – Процесс выполнения Ansible-плейбука.
* *Шаблон задачи (Task Template)* – шаблон, на основе которого создается задача.
* *Inventory* – список серверов, для которых будет выполняться задача.
* *Environment* – переменные окружения (extra vars в терминологии Ansible).
* *Ключ (Key)* – SSH-ключ или логин/пароль, по которому Ansible будет подключаться к серверам.
* *Репозиторий (Repository)* – git-репозиторий, где хранится код Ansible-плейбуков.

## Настройка проекта

**Создадим 3 Inventory** ([вот они](https://demo.ansible-semaphore.com/project/1/inventory)):

* *Build* – указывает на каком сервере будет собираться приложение.
* *Dev* – список серверов, на которые будет разворачиваться приложение в dev-окружении.
* *Production* – список серверов, на которые будет разворачиваться приложение в production-окружении.

**Создадим 3 окружения** ([вот они](https://demo.ansible-semaphore.com/project/1/environment)): Build, Dev, Production.

**Создадим 3 шаблона задач** ([вот они](https://demo.ansible-semaphore.com/project/1/templates)):

* *Build* – для сборки приложения и отправки его в S3-хранилище.
* *Deploy to Dev* – для доставки приложения на сервера dev-окружения.
* *Deploy to Production* – для доставки приложения на сервера production-окружения.

Разворачивать будем вот это нехитрое веб-приложение: <https://github.com/fiftin/ansible-semaphore-test-app> :)

## Запуск

Задача ***Build*** выполняется автоматически при появлении нового коммита в репозитории. Успешные сборки загружаются в S3-хранилище.

После каждой успешной сборки автоматически запускается задача ***Deploy to Dev***, которая разворачивает приложение в Dev-окружении. Демонстрационный dev-сайт доступен по адресу [demo-dev.ansible-semaphore.com](https://demo-dev.ansible-semaphore.com/).

Задачу ***Deploy to Production*** нужно запускать вручную. Она доставляет приложение в Production-окружение, только если оно было успешно развернуто в Dev-окружении.

Если захотите установить у себя:

* Docker: <https://hub.docker.com/r/semaphoreui/semaphore>.
* Snap: <https://snapcraft.io/semaphore>.

Поиграться с описанным выше примером можно на сайте [demo.ansible-semaphore.com](https://demo.ansible-semaphore.com/).
