Begriffe
Bevor wir einsteigen, lohnt es sich, ein paar Begriffe zu klären:
- Ansible Collection — ein Automatisierungspaket, das Rollen, Module und Plugins enthalten kann. Die meisten Module sind in Python geschrieben (für Linux-Server und Netzwerkgeräte) oder in PowerShell (für Windows).
- Ansible Role — eine vordefinierte Sammlung von Tasks, die Variablen, Templates, Dateien und Handler enthalten kann. Eine Rolle kann Teil einer Collection sein oder eigenständig existieren.
- Config as Code (CaC) — die Praxis, Konfiguration über Code zu definieren und zu verwalten, um Automatisierung, Wiederverwendung und Versionskontrolle statt manueller Konfiguration zu ermöglichen.
Einleitung
Mein Name ist Kristian, und ich bin der Autor von ebdruplab.semaphoreui — einer Ansible Collection, mit der sich eine Semaphore UI-Installation per Code verwalten lässt.
Wie es angefangen hat
Das Projekt begann als Weg, Ansible besser zu verstehen. Bis dahin hatte ich vor allem Collections und Rollen anderer genutzt oder mir mit ansible.builtin.cmd, Registern und Jinja2-Templates beholfen.
Meine Neugier wurde zuerst durch die Notwendigkeit geweckt, recht exotische Netzwerkgeräte zu automatisieren — konkret ging es darum zu prüfen, ob die Seriennummern in der Datenbank korrekt gesetzt waren. Nach diesem Projekt kehrte ich zu meiner üblichen Arbeit mit PowerShell zurück, bis mich eine neue Beratungsrolle wieder zu Ansible führte. Dort war alles dabei: Patch-Management, Unterstützung beim Aufsetzen von Ansible-Nodes, Beratung zu Best Practices und die Entwicklung von Inhalten für die Installation von Red Hat Single Sign-On.
Ich arbeite seit sieben Jahren mit Ansible — angefangen mit der CLI, weiter zur Ansible Automation Platform (AAP) v2 und schließlich wieder weg davon. Warum? AAP ist ein mächtiges, aber schwergewichtiges Produkt, gebaut für große Unternehmen. Außerhalb von OpenShift ist die Einrichtung mühsam, und die Lizenzkosten spiegeln das wider.
Warum Semaphore UI
Semaphore UI hat mich mit seiner Einfachheit überzeugt. Ein Paket, ein Server (sofern man keine Enterprise-Skalierung braucht) — statt sechs VMs, die über zehn Ports auf zehn verschiedene Arten miteinander sprechen.
Ja, die Execution Environments von AAP sind elegant. Aber sie zu pflegen ist eine andere Geschichte. Semaphore UI lässt sich leicht patchen, leicht betreiben und bringt eine reaktionsschnelle, intuitive Oberfläche mit. Einige fortgeschrittene Funktionen fehlen zwar, doch für meine Anwendungsfälle trifft es die richtige Balance zwischen Leistungsumfang und Kosten.
Von Semaphore hörte ich zuerst in der Homelab-Community und maß dem wenig Bedeutung bei — bis ich es tatsächlich ausprobierte. Als ich dann auf Ansible Galaxy nachsah und keine passende Collection fand, war die Entscheidung leicht: Das würde mein Lernprojekt werden. Habe ich den gesamten Code selbst geschrieben? Nein — ich habe durchgehend KI-Unterstützung genutzt. Aber das Projekt wuchs Schritt für Schritt: hier 30 Minuten, dort eine Stunde. Schon bald hatte ich die komplette Semaphore-API in Python-Module übersetzt.

Was kann man damit machen?
Auf Ansible Galaxy gibt es Beispiele dafür, was mit ebdruplab.semaphoreui möglich ist. Hier trotzdem ein paar davon:
Projekte anlegen und verwalten — beschreiben Sie Ihre Semaphore-Projekte als Code und rollen Sie sie reproduzierbar aus
- 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
Inventories konfigurieren — statische und dynamische Inventories programmatisch verwalten
- 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
Job-Templates einrichten — Templates anlegen und aktualisieren, ohne die Oberfläche zu öffnen
- 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"]
Benutzer verwalten — das Anlegen von Benutzern und ihre Zuordnung zu einem Projekt automatisieren
- 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
Bestehende Projekte sichern — jedes laufende Projekt als YAML exportieren und unter Versionskontrolle stellen
- 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"
Wiederherstellen oder migrieren — ein komplettes Projekt-Setup in Sekunden aus einer YAML-Definition neu ausrollen.
- hosts: localhost
gather_facts: false
vars_files:
- vars/project.yml
roles:
- role: ebdruplab.semaphoreui.project_deploy
Config as Code — ebdruplab.project_deploy
Aus einem Modul wurden zwei. Aus zwei wurden zehn. Am Ende umfasste die Collection 92 Module für Projekte, Templates, Inventories und vieles mehr.
Irgendwann bat ein Nutzer um eine Rolle, die all diese Module zusammenhält. Diese Rolle — ebdruplab.project_deploy — erlaubt es, genau zu beschreiben, wie ein Semaphore UI-Projekt aussehen soll, und es dann deklarativ über Ansible anzulegen.



So sieht eine minimale Projektdefinition aus:
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: {}
Die Dokumentation ist auf Ansible Galaxy verfügbar, und das GitHub-Repository enthält sowohl in project_deploy als auch in project_backup die Ordner examples/ und test/ für einen leichten Einstieg.
Config as Code Converter — ebdruplab.project_backup
Nachdem project_deploy fertig war, kam mir eine weitere Idee: Was ist mit bestehenden Semaphore-Projekten, die nicht per Code entstanden sind? Genau dafür habe ich ebdruplab.project_backup gebaut — es nimmt ein bestehendes Projekt und exportiert es als YAML-Variablendatei, die mit project_deploy kompatibel ist.
Damit schließt sich der Kreis: Ob Sie bei null anfangen oder ein bestehendes Setup migrieren — Sie können alles unter Versionskontrolle bringen.


Loslegen
Installieren Sie die Collection mit einem einzigen Befehl:
ansible-galaxy collection install ebdruplab.semaphoreui
Werfen Sie danach einen Blick in die vollständige Dokumentation auf Ansible Galaxy oder stöbern Sie in den Beispielen auf GitHub.
Wenn Sie Fehler finden oder eine Idee haben, zögern Sie nicht, ein Issue/Feature/Question anzulegen: https://github.com/Ebdruplab/ansible-collection_ebdruplab/issues — ansonsten treibe ich mich meist in den Discord-Servern von Semaphore UI herum, als TrimmerWolf7.
Ich hoffe, die Collection ist für Sie nützlich.