Over syv år med Ansible gik jeg fra simple CLI-kommandoer til at opbygge min egen samling af 92 moduler til styring af Semaphore UI. I dette indlæg vil jeg gennemgå, hvordan et lille læringsprojekt voksede til et komplet Config as Code-værktøjssæt — og hvorfor jeg valgte Semaphore frem for Red Hat AAP.
Terminologi
Før vi dykker ned i det, er et par udtryk værd at afklare:
- Ansible Collection — en automatiseringspakke, der kan indeholde Roller, Moduler og plugins. De fleste moduler er skrevet i Python (til Linux-servere og netværksudstyr) eller PowerShell (til Windows).
- Ansible Role — et foruddefineret sæt af opgaver, som kan indeholde variabler, skabeloner, filer og handlere. En Rolle kan pakkes i en Collection eller eksistere som en selvstændig enhed.
- Config as Code (CaC) — praksis med at definere og styre konfiguration gennem kode, hvilket muliggør automatisering, genbrug og versionskontrol i stedet for manuel konfiguration.
Introduktion
Mit navn er Kristian, og jeg er forfatter til ebdruplab.semaphoreui — en Ansible Collection til styring af din Semaphore UI-installation gennem kode.
Hvordan det startede
Projektet begyndte som en måde at uddybe min forståelse af Ansible på. Indtil da havde jeg for det meste brugt collections og roller opbygget af andre, eller stykket ansible.builtin.cmd, registers og Jinja2-skabeloner sammen for at få arbejdet gjort.
Min nysgerrighed blev først vakt af et behov for at automatisere noget obskurt netværksudstyr — specifikt at validere, at databasens serienumre var indstillet korrekt. Efter det projekt vendte jeg tilbage til mit sædvanlige arbejde i PowerShell, indtil en ny konsulentrolle trak mig tilbage til Ansible. Denne rolle involverede alt fra patch management til hjælp med at konfigurere Ansible-knuder, rådgive om best practices og opbygge indhold til installation af Red Hat Single Sign-On.
Jeg har arbejdet med Ansible i syv år — startede med CLI, gik videre til Ansible Automation Platform (AAP) v2 og trådte til sidst tilbage fra det. Hvorfor? AAP er et kraftfuldt, men tungt produkt, bygget til store virksomheder. Det er besværligt at opsætte uden for OpenShift, og licensomkostningerne afspejler det.
Hvorfor Semaphore UI
Semaphore UI vandt mig over med sin enkelhed. Én pakke, én server (medmindre du har brug for virksomhedsskala) — ikke seks VM’er, der kommunikerer over ti porte på ti forskellige måder.
Ja, AAP’s eksekveringsmiljøer er elegante. Men at vedligeholde dem er en anden historie. Semaphore UI er let at patche, let at køre og leveres med en responsiv, intuitiv grænseflade. Det mangler nogle avancerede funktioner, men til mine use cases rammer det den rette balance mellem kapacitet og omkostninger.
Jeg hørte første gang om Semaphore i homelab-fællesskabet og tænkte ikke meget over det — før jeg rent faktisk prøvede det. Da jeg tjekkede Ansible Galaxy og fandt ud af, at der ikke var nogen collection til det, var beslutningen nem: Dette skulle være mit læringsprojekt. Skrev jeg al koden selv? Nej — jeg lænede mig op ad AI-assistance hele vejen igennem. Men projektet tog form gradvist: 30 minutter her, en time der. Før der var gået lang tid, havde jeg oversat hele Semaphore API’et til Python-moduler.

Hvad kan du gøre med den?
På Ansible Galaxy er der eksempler på, hvad du kan gøre med ebdruplab.semaphoreui. Men bare for at give nogle eksempler:
Opret og administrer projekter — definer dine Semaphore-projekter som kode og udrul dem gentageligt
- 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
Konfigurer inventories — administrer statiske og dynamiske inventories programmatisk
- 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
Opret jobskabeloner — opret og opdater skabeloner uden at røre ved brugerfladen
- 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"]
Administrer brugere — automatiser oprettelsen af brugere og tildel dem til et projekt
- 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
Sikkerhedskopier eksisterende projekter — eksporter ethvert aktivt projekt til YAML til versionskontrol
- 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"
Gendan eller migrer — genudrul en komplet projektopsetning fra en YAML-definition på få sekunder.
- hosts: localhost
gather_facts: false
vars_files:
- vars/project.yml
roles:
- role: ebdruplab.semaphoreui.project_deploy
Config as Code — ebdruplab.project_deploy
Ét modul blev til to. To blev til ti. Til sidst nåede samlingen op på 92 moduler, der dækker projekter, skabeloner, inventories og meget mere.
På et tidspunkt bad en bruger om en Rolle, der kunne fungere som limen mellem alle disse moduler. Den Rolle — ebdruplab.project_deploy — lader dig definere præcis, hvordan et Semaphore UI-projekt skal se ud, og derefter oprette det deklarativt gennem Ansible.



Her er hvordan en minimal projektdefinition ser ud:
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: {}
Dokumentation er tilgængelig på Ansible Galaxy, og GitHub-repositoryet indeholder mapperne examples/ og test/ inde i både project_deploy og project_backup for at hjælpe dig i gang.
Config as Code Converter — ebdruplab.project_backup
Efter at have bygget project_deploy fik jeg en anden idé: hvad med eksisterende Semaphore-projekter, der ikke blev oprettet gennem kode? Jeg byggede ebdruplab.project_backup for at løse netop det — den tager et eksisterende projekt og eksporterer det som en YAML-variabelfil, der er kompatibel med project_deploy.
Dette fuldender cirklen: uanset om du starter fra bunden eller migrerer en eksisterende opsætning, kan du bringe alt under versionskontrol.


Kom godt i gang
Installer samlingen med en enkelt kommando:
ansible-galaxy collection install ebdruplab.semaphoreui
Gå derefter til den fulde dokumentation på Ansible Galaxy eller udforsk eksemplerne på GitHub.
Hvis du finder fejl eller har en idé, skal du ikke tøve med at oprette et issue/feature/spørgsmål - https://github.com/Ebdruplab/ansible-collection_ebdruplab/issues, ellers hænger jeg ud på Semaphore UI’s discord-servere - TrimmerWolf7.
Håber du finder samlingen nyttig.
