Ansible ile yedi yılı aşkın bir süre çalıştıktan sonra basit CLI komutlarından Semaphore UI’ı yönetmek için 92 modülden oluşan kendi koleksiyonumu oluşturmaya kadar uzanan bir yol katettim. Bu yazıda, küçük bir öğrenme projesinin nasıl eksiksiz bir Kod Olarak Yapılandırma (Config as Code) araç setine dönüştüğünü ve neden Red Hat AAP yerine Semaphore’u seçtiğimi anlatacağım.

Terminoloji

Ayrıntılara dalmadan önce netleştirilmeye değer birkaç terim:

  • Ansible Koleksiyonu (Collection) — Roller, Modüller ve eklentiler içerebilen bir otomasyon paketi. Çoğu modül Python (Linux sunucuları ve ağ ekipmanları için) veya PowerShell (Windows için) ile yazılmıştır.
  • Ansible Rolü (Role) — Değişkenler, şablonlar, dosyalar ve işleyiciler içerebilen önceden tanımlanmış bir görev kümesi. Bir Rol bir Koleksiyon içinde paketlenebilir veya bağımsız bir varlık olarak bulunabilir.
  • Kod Olarak Yapılandırma (Config as Code - CaC) — Manuel yapılandırma yerine otomasyon, yeniden kullanılabilirlik ve sürüm kontrolü sağlayarak yapılandırmayı kod aracılığıyla tanımlama ve yönetme uygulaması.

Giriş

Benim adım Kristian ve Semaphore UI kurulumunuzu kod aracılığıyla yönetmeye yarayan bir Ansible Koleksiyonu olan ebdruplab.semaphoreui’nin yazarıyım.

Nasıl Başladı?

Proje, Ansible anlayışımı derinleştirmenin bir yolu olarak başladı. O zamana kadar çoğunlukla başkaları tarafından oluşturulan koleksiyonları ve rolleri tüketiyor veya işleri halletmek için ansible.builtin.cmd, register’lar ve Jinja2 şablonlarını birbirine bağlıyordum.

Merakım ilk olarak bazı sıra dışı ağ ekipmanlarını otomatikleştirmek — özellikle veritabanı seri numaralarının doğru ayarlandığını doğrulamak — ihtiyacıyla tetiklendi. Bu projeden sonra PowerShell’deki olağan işime geri döndüm, ta ki yeni bir danışmanlık rolü beni tekrar Ansible’a çekene kadar. Bu rol, yama yönetiminden Ansible düğümlerini kurmaya yardımcı olmaya, en iyi uygulamalar konusunda danışmanlık yapmaya ve Red Hat Single Sign-On kurulumu için içerik oluşturmaya kadar her şeyi içeriyordu.

Yedi yıldır Ansible ile çalışıyorum — CLI ile başlayıp Ansible Automation Platform (AAP) v2’ye geçtim ve sonunda bundan geri adım attım. Neden? AAP güçlü ancak büyük kuruluşlar için üretilmiş hantal bir üründür. OpenShift dışında kurulumu sancılıdır ve lisans maliyeti de bunu yansıtır.

Neden Semaphore UI?

Semaphore UI sadeliğiyle beni kazandı. Tek bir paket, tek bir sunucu (kurumsal ölçeğe ihtiyacınız yoksa) — on farklı bağlantı noktası üzerinden on farklı şekilde iletişim kuran altı sanal makine değil.

Evet, AAP’nin yürütme ortamları (execution environments) zariftir. Ancak bunları korumak bambaşka bir hikayedir. Semaphore UI’ı yamalamak kolaydır, çalıştırmak kolaydır ve hızlı, sezgisel bir arayüzle birlikte gelir. Bazı gelişmiş özelliklerden yoksundur, ancak benim kullanım senaryolarım için yetenek ve maliyetin doğru dengesini yakalar.

Semaphore’u ilk olarak homelab topluluğunda duydum ve pek düşünmedim — ta ki gerçekten deneyene kadar. Ansible Galaxy’yi kontrol edip bunun için hiçbir koleksiyon bulamadığımda karar kolay oldu: bu benim öğrenme projem olacaktı. Tüm kodu kendim mi yazdım? Hayır — başından sonuna kadar yapay zeka yardımından yararlandım. Ancak proje kademeli olarak şekillendi: burada 30 dakika, orada bir saat. Çok geçmeden Semaphore API’sinin tamamını Python modüllerine dönüştürmüştüm.

Bununla Neler Yapabilirsiniz?

Ansible Galaxy’de ebdruplab.semaphoreui ile neler yapabileceğinize dair örnekler var. Ancak birkaç örnek vermek gerekirse:

Projeler oluşturun ve yönetin — Semaphore projelerinizi kod olarak tanımlayın ve tekrarlanabilir şekilde dağıtın

- 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

Envanterleri yapılandırın — statik ve dinamik envanterleri programlı olarak yönetin

- 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

İş şablonları ayarlayın — kullanıcı arayüzüne dokunmadan şablonlar oluşturun ve güncelleyin

- 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"]

Kullanıcıları yönetin — kullanıcıların oluşturulmasını otomatikleştirin ve bunları bir projeye atayın

- 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

Mevcut projeleri yedekleyin — sürüm kontrolü için herhangi bir canlı projeyi YAML’a aktarın

- 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"

Geri yükleyin veya taşıyın — tam bir proje kurulumunu saniyeler içinde bir YAML tanımından yeniden dağıtın.

- hosts: localhost
  gather_facts: false
  vars_files:
    - vars/project.yml
  roles:
    - role: ebdruplab.semaphoreui.project_deploy

Kod Olarak Yapılandırma — ebdruplab.project_deploy

Bir modül iki oldu. İki modül on oldu. Sonunda koleksiyon projeleri, şablonları, envanterleri ve çok daha fazlasını kapsayan 92 modüle ulaştı.

Bir noktada bir kullanıcı tüm bu modüller arasında yapıştırıcı görevi görebilecek bir Rol istedi. Bu Rol — ebdruplab.project_deploy — bir Semaphore UI projesinin tam olarak nasıl görünmesi gerektiğini tanımlamanıza, ardından bunu Ansible aracılığıyla bildirimsel (declarative) olarak oluşturmanıza olanak tanır.

Minimum bir proje tanımının görünümü şöyledir:

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: {}

Belgeler Ansible Galaxy’de mevcuttur ve GitHub deposu, başlamanıza yardımcı olmak için hem project_deploy hem de project_backup içinde examples/ ve test/ klasörleri içerir.

Kod Olarak Yapılandırma Dönüştürücü — ebdruplab.project_backup

project_deploy rolünü oluşturduktan sonra aklıma başka bir fikir geldi: kod aracılığıyla oluşturulmamış mevcut Semaphore projeleri ne olacak? Tam olarak bunu çözmek için ebdruplab.project_backup rolünü geliştirdim — mevcut bir projeyi alır ve bunu project_deploy ile uyumlu bir YAML değişken dosyası olarak dışa aktarır. Bu döngüyü kapatır: ister sıfırdan başlıyor olun ister mevcut bir kurulumu taşıyor olun, her şeyi sürüm kontrolü altına alabilirsiniz.

Başlarken

Koleksiyonu tek bir komutla kurun:

ansible-galaxy collection install ebdruplab.semaphoreui

Ardından Ansible Galaxy’deki tam belgelere gidin veya GitHub’daki örnekleri keşfedin.

Herhangi bir hata bulursanız veya bir fikriniz varsa lütfen bir sorun/özellik/soru oluşturmaktan çekinmeyin - https://github.com/Ebdruplab/ansible-collection_ebdruplab/issues, aksi takdirde Semaphore UI discord sunucularında olacağım - TrimmerWolf7.

Koleksiyonu yararlı bulacağınızı umuyorum.

İlginizi çekebilecek diğer yazılar