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.

Du vil måske finde dette interessant