Terminología
Antes de entrar en materia, conviene aclarar algunos términos:
- Ansible Collection — un paquete de automatización que puede incluir roles, módulos y plugins. La mayoría de los módulos están escritos en Python (para servidores Linux y equipos de red) o en PowerShell (para Windows).
- Ansible Role — un conjunto predefinido de tareas, que puede incluir variables, plantillas, archivos y handlers. Un rol puede empaquetarse dentro de una colección o existir de forma independiente.
- Config as Code (CaC) — la práctica de definir y gestionar la configuración mediante código, lo que permite automatización, reutilización y control de versiones en lugar de configuración manual.
Introducción
Me llamo Kristian y soy el autor de ebdruplab.semaphoreui, una Ansible Collection para gestionar tu instalación de Semaphore UI mediante código.
Cómo empezó
El proyecto nació como una forma de profundizar en Ansible. Hasta entonces, sobre todo consumía colecciones y roles creados por otros, o iba encadenando ansible.builtin.cmd, registers y plantillas Jinja2 para sacar el trabajo adelante.
Mi curiosidad se despertó por la necesidad de automatizar unos equipos de red bastante peculiares; en concreto, validar que los números de serie de la base de datos estuvieran correctamente configurados. Después de ese proyecto volví a mi trabajo habitual con PowerShell, hasta que un nuevo puesto de consultoría me devolvió a Ansible. Aquel puesto incluía de todo: desde la gestión de parches hasta ayudar a montar nodos de Ansible, asesorar sobre buenas prácticas y crear contenido para instalar Red Hat Single Sign-On.
Llevo siete años trabajando con Ansible: empecé con la CLI, pasé a Ansible Automation Platform (AAP) v2 y finalmente me alejé de ella. ¿Por qué? AAP es un producto potente pero pesado, pensado para grandes empresas. Es doloroso de configurar fuera de OpenShift, y el coste de las licencias lo refleja.
Por qué Semaphore UI
Semaphore UI me conquistó por su simplicidad. Un paquete, un servidor (salvo que necesites escala empresarial), y no seis máquinas virtuales comunicándose por diez puertos de diez maneras distintas.
Sí, los execution environments de AAP son elegantes. Pero mantenerlos es otra historia. Semaphore UI es fácil de parchear, fácil de ejecutar y viene con una interfaz ágil e intuitiva. Es cierto que le faltan algunas funciones avanzadas, pero para mis casos de uso ofrece el equilibrio justo entre capacidades y coste.
Oí hablar de Semaphore por primera vez en la comunidad de homelab y no le di importancia, hasta que lo probé de verdad. Cuando revisé Ansible Galaxy y no encontré ninguna colección para él, la decisión fue fácil: este sería mi proyecto de aprendizaje. ¿Escribí todo el código yo mismo? No: me apoyé en la ayuda de la IA durante todo el proceso. Pero el proyecto fue tomando forma poco a poco: media hora aquí, una hora allá. En poco tiempo había traducido toda la API de Semaphore a módulos de Python.

¿Qué puedes hacer con ello?
En Ansible Galaxy hay ejemplos de lo que puedes hacer con ebdruplab.semaphoreui. Pero aquí van algunos:
Crear y gestionar proyectos — define tus proyectos de Semaphore como código y despliégalos de forma repetible
- name: Create project with token and custom settings
ebdruplab.semaphoreui.project_create:
host: http://localhost
port: 3000
api_token: "{{ semaphore_token }}"
name: "My Project"
alert: true
alert_chat: "#alerts"
max_parallel_tasks: 5
demo: false
Configurar inventarios — gestiona inventarios estáticos y dinámicos de forma programática
- name: Create static inventory
ebdruplab.semaphoreui.project_inventory_create:
host: http://localhost
port: 3000
session_cookie: "{{ login_result.session_cookie }}"
project_id: 1
inventory:
name: "Local Static Inventory"
type: "static"
inventory: "localhost ansible_connection=local"
ssh_key_id: 42
become_key_id: 7
Configurar plantillas de trabajos — crea y actualiza plantillas sin tocar la interfaz
- name: Create template with UI-style override flags
ebdruplab.semaphoreui.project_template_create:
host: http://localhost
port: 3000
api_token: "{{ semaphore_token }}"
project_id: 1
template:
name: "ff"
playbook: "f"
repository_id: 1
inventory_id: 1
environment_id: 1
type: ""
arguments: "[]"
task_params:
allow_override_tags: true
allow_override_limit: true
tags: ["t"]
limit: ["t"]
Gestionar usuarios — automatiza la creación de usuarios y su asignación a un proyecto
- name: Create a new user
ebdruplab.semaphoreui.user_create:
host: http://localhost
port: 3000
session_cookie: "{{ login_result.session_cookie }}"
name: "Jane Smith"
username: "jsmith"
email: "[email protected]"
password: "supersecure123"
admin: true
alert: true
Hacer copias de seguridad de proyectos existentes — exporta cualquier proyecto en producción a YAML para llevarlo al control de versiones
- hosts: localhost
gather_facts: false
roles:
- role: ebdruplab.semaphoreui.project_backup
vars:
project_backup_semaphore_host: "https://semaphore.example.com"
project_backup_semaphore_api_token: "{{ lookup('env', 'SEMAPHORE_TOKEN') }}"
project_backup_project_name: "My Project"
Restaurar o migrar — vuelve a desplegar la configuración completa de un proyecto desde una definición YAML en segundos.
- hosts: localhost
gather_facts: false
vars_files:
- vars/project.yml
roles:
- role: ebdruplab.semaphoreui.project_deploy
Config as Code — ebdruplab.project_deploy
Un módulo se convirtió en dos. Dos se convirtieron en diez. Al final, la colección llegó a 92 módulos, que cubren proyectos, plantillas, inventarios y mucho más.
En cierto momento, un usuario pidió un rol que sirviera de pegamento entre todos esos módulos. Ese rol, ebdruplab.project_deploy, te permite definir exactamente cómo debe ser un proyecto de Semaphore UI y luego crearlo de forma declarativa con Ansible.



Así es como se ve una definición mínima de proyecto:
project_deploy_config:
project:
name: "My Project"
alert: false
alert_chat: ""
max_parallel_tasks: 0
demo: false
users_access:
- username: "admin"
role: "Owner"
keys:
repo_login:
name: "Git Login"
type: login_password
login_password:
login: "git-user"
password: "{{ vault_git_password }}"
repositories:
- name: "Example Repo"
git_url: "https://github.com/example/repo.git"
git_branch: "main"
key_name: "Git Login"
views:
main:
title: "Main"
position: 0
inventories:
local_inventory:
name: "Local Inventory"
type: "static"
inventory: "localhost ansible_connection=local"
environments:
default_env:
name: "Default Environment"
env:
APP_ENV: "prod"
templates:
deploy_job:
name: "Deploy"
type: "job"
repository_name: "Example Repo"
inventory_name: "Local Inventory"
environment_name: "Default Environment"
view_title: "Main"
playbook: "playbooks/site.yml"
schedules: {}
integrations: {}
La documentación está disponible en Ansible Galaxy, y el repositorio de GitHub incluye las carpetas examples/ y test/ dentro tanto de project_deploy como de project_backup para ayudarte a empezar.
Conversor de Config as Code — ebdruplab.project_backup
Después de crear project_deploy se me ocurrió otra idea: ¿qué pasa con los proyectos de Semaphore existentes que no se crearon con código? Construí ebdruplab.project_backup justo para eso: toma un proyecto existente y lo exporta como un archivo YAML de variables compatible con project_deploy.
Esto cierra el círculo: tanto si empiezas desde cero como si migras una instalación ya existente, puedes llevarlo todo al control de versiones.


Empezar
Instala la colección con un solo comando:
ansible-galaxy collection install ebdruplab.semaphoreui
Después consulta la documentación completa en Ansible Galaxy o explora los ejemplos en GitHub.
Si encuentras algún error o tienes una idea, no dudes en abrir un issue/feature/question: https://github.com/Ebdruplab/ansible-collection_ebdruplab/issues; si no, suelo andar por los servidores de Discord de Semaphore UI como TrimmerWolf7.
Espero que la colección te resulte útil.