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.
