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.

You might also like