Semaphore UI - веб для Ansible, Terraform и прочего

UI для

  • Terraform
  • OpenTofu
  • Bash
  • PowerShell
  • Python
  • Terragrunt

Интересности

  • Проект развивается, обновления не очень крупные, но выходят часто
  • SSO есть
  • Веб хуки есть
  • Уведомления на почту и в телегу есть
  • Выполнение по расписанию есть
  • Работа с GIT есть
  • Пайплайны есть
  • Проекты и права доступа есть
  • Поддерживается темная тема и мобильная адаптивная версия
  • Экспорта метрик я не нашел, есть issue на эту тему

Цены

  • Бесплатная версия практически идеальна
  • Платная версия с доп фишками
Feature Standard Pro Enterprise
Task execution :white_check_mark: :white_check_mark: :white_check_mark:
Project runners management :white_check_mark: (Pro users only) :white_check_mark:
Terraform/OpenTofu HTTP backend :white_check_mark: (Pro users only) :white_check_mark:
Export logs to external systems :white_check_mark: :white_check_mark:
Two-factor authentication (2FA) :white_check_mark: :white_check_mark:
Task execution summary :white_check_mark: :white_check_mark:
Built-in Swagger API Docs :white_check_mark: :white_check_mark:
Requesting features :white_check_mark: :white_check_mark:
Support Community-based 24h guaranteed email support (Mon–Fri) 12h or less support reply, faster with upgrades
High availability :white_check_mark:
Onboarding help :white_check_mark:
Help with upgrades :white_check_mark:
Custom feature development :white_check_mark:

Установка

Я ставил в docker compose

  semaphore:
    ports:
      - 80:3000
    image: semaphoreui/semaphore:latest
    env_file:
      - secrets/semaphore.env
      - secrets/secrets.env
    volumes:
      - ./data:/var/lib/semaphore
      - ./config:/etc/semaphore
      - ./tmp:/tmp/semaphore
    depends_on:
      vault-agent:
        condition: service_healthy
    restart: unless-stopped

После установки у нас сразу создается демо проект (но это не точно)

Проекты
Поддерживаются проекты, это все, что можно (кроме пользователей) объединенное в отдельном пространстве, права доступа назначаются на проект, внутри проекта все сущности, которые описываю дальше

Главная страница встречает логом задач

Task templates
Мы тут видим все плейбуки, и прочие задачи, отображается статус последнего выполнения, задачи поделены на группы при помощи табов

При нажатии на иконку запуска появляется всплывающее окно, содержимое зависит от типа задачи и ее параметров

Репозитории
В разделе репозиториев мы можем добавить репозитории, которые будем использовать, поддерживаются как публичные, так и приватные
При запуске задачи из репозитория происходит скачивание актуальной версии

Ansible Inventory
Тут мы можем либо править руками, либо указать пусть к файлу в репозитории



Variable groups
Тут без излишеств, только ручное добавление переменных и секретов, подтягивать откуда-то нельзя

Key Store
Содержит креды для самих плейбуков и репозиториев

Ansible Playbook
Тут мы указываем репозитрий с плейбуком, inventory, var group и собственно, сам путь к плейбуку
Ну и россыпь настроек, в том числе можно спрашивать пользователя при старте


Например, у меня для деплоя сертификата указывается домен (сертификат)

Terraform/Terragrunt/Opentofu
Тут все похоже: тепозиторий и путь к соответствующему файлу, workspace, variable group. Можно включить автоапрув и прочее

Bash/Python/Powershell
Тут минимальный функционал: опять репозиторий и скрипт, Var Group (устанавливаются переменные окружения)

Лог таски
При запуске отображается индикатор выполнения и можно посмотреть лог в режиме реального времени


Внизу видна общая информация по выполенению, но это фишка не Semaphore UI

Вкладка с деталями

Вкладка с общей информацией
А вот тут нас встречает первый платный функционал, количество и список серверов, на которых выполнилось успешно или с ошибкой надо смотреть на 1 владке, а не тут

Расписание
Можно настроить запуск таски по расписанию, тогда будет работать автоматом

Integrations
Тут мы можем создавать веб хаки для запуска наших тасок


Для каждой интеграции указывается таска, тип аутентификаиции и кючи, как мы видим, можно подключить гитхабу и битбакету в качестве вебхука (при пуше в репозиторий будет выполняться)

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

Вот пример запуска вебхука при генерации нового letsencrypt сертификата

if [ ! -z "$WEBHOOK_URL" ] ; then
    curl --location $WEBHOOK_URL \
    --header "X-Token: ${WEBHOOK_TOKEN}" \
    --header 'Content-Type: application/json' \
    --data "{
        \"domain\": \"$DOMAIN\"
    }"
    echo "✅ Webhook успешно отправлен"
fi

Права доступа
В рамках проекта настраиваются права доступа ко всему, что есть внутри проекта

Ну и остальные вклладки свойств проекта (history показывал одним из первых скриншотов)
Статистика запуска задач


Лог активности

Настройки
Тут можно настроить количество параллельных выполнений и ID TG чата для уведомлений

В чате это выглядит так

Можно настроить различные типы уведомлений

Вкладка Runners
Встречает нас еще одним платным функционалом, бесплатно Semaphore UI запускает все у себя, но для хомлабы этого достаточно

Официальная дока практически идеальна

Выводы

Очень крутая система для запуска автоматизаций, по сути, не надо в репозиториях писать раннеры, а достаточно из них вызывать вебхук

Бесплатный функционал вполне достаточен для жизни, можно частично обойти ограничения, например, вот так у меня vault-agent передает секреты из openbao

# Managed by vault-agent and https://openbao.domain.com
{{ with secret "kv/services/semaphore/secrets" }}
{{- range $key, $value := .Data.data -}}
{{ printf "%s=%s\n" $key $value }}
{{- end }}
# Forvard envs to playbook
{{ $first := true -}}
{{ printf "SEMAPHORE_FORWARDED_ENV_VARS='[" -}}
{{- range $key, $_ := .Data.data -}}
  {{- if not $first }},{{ end -}}
  {{- printf "\"%s\"" $key -}}
  {{- $first = false -}}
{{- end -}}
{{- printf "]'\n" -}}
{{- end }}
1 лайк

сколько времени открыта вкладка, все никак не посмотрю

Тут выясил, что оказывается, Inventory умеет брать из NetBox, это еще одна интересная штука для каталогизации и документизации IT инфраструктуры. Пока не пробовал данный плагин, но есть желание таки довести до ума NetBox и использовать его как первичный источник данных о сети и хомлабе

NetBox тоже хочу заюзать, тоже ролики открыл, но еще не смотрел

Он прикольный, но python, тяжеловатый достаточно. Ну и были проблемы с вылетом страницы устройства, но вот с последним релизом поправили.

Там по хорошему, надо все собирать из реальной сети, о я готовых компонентов не нашел, которые бы мне подошли. В итоге начал с NodeRed, он работает для простых задач, но когда надо импортировать содержимое PVE кластера в NetBox, то тут вылезают сразу сложности.

У меня была мысль написать на Python же скрипты синхронизации и запускать внутри Semaphore UI, есть неплохие либы работы как с PVE, так и с Netbox, ну а дальше обмазаться еще тегами и настроить выгрузку DNS записей для привязки доменов сервисов к конкретной ноде PVE

а руками нельзя что ли добавить?

и чего тяжелого в питоне? вроде он быстрей работает чем пхп

Можно, а зачем ?(с)
У них идеология такая, что все должно строиться автоматически, в облачной версии есть несколько ИИшных инструментов, которые собирают информацию об оборудоваии и грузят ее в NetBox, а у NetBox есть типа очень крутая апишка

Руками я создавал стойки, железки, VLANы, сегменты сети и какие-то коммуникации, в целом, руками заводить на таком уровне можно.

А далее DHCP сервер при выделении IP адреса вызывает вебхук, который добавляет адрес в IPAM, при выделении статического адреса я сразу вижу какие свободы, а какие заняты.

Другой скрипт проходится по виртуалкам и контейнерам в кластере и создает их в NetBox, заполняет выделенные ресурсы, ссылки, вот мне осталось сетевые интерфейсы. Но есть вот такой готовый проект

Было бы неплохо еще сделать линковку портов коммутаторов на основе таблиц MAC адресов

Ну по сравнению с современными Go/Rust приложухами, которые оперативку только нюхают, у меня что Authentik, что Netbox, что HomeAssistant являются самыми жирными сервисами, как по фоновой оперативке, так и по фоновому процессору. Что-то уровня N4000 уже не вывозит.


Хотя… не все так очевидно оказалось

Раньше, когда начал изучать ансибл пользовался семафором. Потом устал делать репозиторий и пайплайны, ушел в гитлаб. После того как гитлаб начал жрать неразумно много ресуров вернулся снова в gitea, но уже без семафора. там есть gitea actions, которые в целом дают почти такой же функционал, за исключением пары моментов - уведомления об ошибках при запланированном задании сейчас отсутствуют