İçeriğe geç
NetDevOps
7 dk okuma DevOps

Puppet ile Merkezi Yapilandirma Yonetimi

Fikrin bütünüyle tersine, sunucu sayısı arttıkça elle yapılandırma yapmaya çalışan ekipler daha fazla üretken olmuyor. Aynı komut dizisi elli makinede çalışıyor, elli birinci makinede SELinux sebebiyle dosya izni değiştiği için patlıyor. Kimse fark etmiyor. Üç ay sonra denetim geldiğinde "bu sunucuda neden farklı config var" sorusuna cevap bulmak için bütün gün shell history karıştırılıyor. Puppet bu sorunu şu mantıkla çözüyor: sistemin nasıl olması gerektiğini değil, ne olması gerektiğini tanımla. İşletim sistemi fark etmiyor, süreç de fark etmiyor.

Luke Kanies 2005 yılında Puppet'ı bu farkındalıkla yazmaya başladı. Ruby ile geliştirildi, 4.0 sürümünden itibaren compiler ve bazı bileşenler Clojure'a taşındı. 2011'de Puppet Enterprise çıktı, 2022 Nisan'ında Perforce şirketi Puppet Inc.'i satın aldı. 2024 sonunda Perforce açık kaynak lisans modelini değiştirdi ve topluluk Vox Pupuli'nin öncülüğünde OpenVox adında bir fork başlattı. OpenVox 8.11, Puppet 8.11 ile birebir aynı ve şeffaf bir alternatif olarak kullanılabiliyor. Apache 2.0 lisansıyla dağıtılıyor. Bu yazıda Puppet Core'un temel mimarisine, manifest yazımına, Hiera veri katmanına ve agent/master iletişimine odaklanacağım.

Master-Agent Mimari ve SSL

Puppet, agent/master modelinde çalışır. Puppet Server (eski adıyla Puppet Master) JVM üzerinde koşan bir Java uygulamasıdır. Konfigürasyon kataloglarını derler ve agent node'lara sunar. Agent'lar üzerinde çalıştıkları node'dan fact adı verilen sistem bilgilerini toplar, bunları master'a gönderir ve karşılığında katalog alır.

İletişim SSL/TLS ile şifrelenir. Port 8140/TCP kullanılır. Agent ilk kez master'a bağlandığında bir sertifika imzalama isteği (CSR) gönderir. Master'da şu komutla bekleyen istekler listelenir:

sudo puppetserver ca list

Onaylamak için:

sudo puppetserver ca sign --certname puppet-agent.example.com

Sertifika imzalanmadan agent katalog alamaz. --waitforcert seçeneği ile agent bekleyebilir ya da manuel onay gerekir. Bu model, yetkisiz node'ların katalog almasını engeller.

Kurulum Adımları

Ubuntu 24.04 üzerinde Puppet Server 9 kurulumu resmi paket depoları üzerinden yapılır:

wget https://apt.puppet.com/puppet9-release-noble.deb
sudo dpkg -i puppet9-release-noble.deb
sudo apt update
sudo apt install -y puppetserver

Puppet Server varsayılan olarak 2 GB RAM kullanır. VM üzerinde test yapıyorsanız /etc/default/puppetserver dosyasından JAVA_ARGS satırını düzenleyerek 512 MB'a düşürebilirsiniz:

JAVA_ARGS="-Xms512m -Xmx512m"

Agent kurulumu için:

sudo apt install -y puppet-agent
source /etc/profile.d/puppet-agent.sh

Agent'ın hangi sunucuya bağlanacağını /etc/puppetlabs/puppet/puppet.conf dosyasında belirtirsiniz:

[main]
server = puppet-server.example.com
environment = production

Manifest Yazımı: Beyan Et, Emir Etme

Puppet programları manifest olarak adlandırılır ve .pp uzantısıyla kaydedilir. Manifestler beyan edici (declarative) bir DSL kullanır. Sıralı komut listesi değil, sistemin son durumunun tanımıdır. Örneğin:

file { '/etc/motd':
  ensure  => file,
  owner   => 'root',
  group   => 'root',
  mode    => '0644',
  content => "Bu sistem Puppet tarafından yönetiliyor.\n",
}

package { 'nginx':
  ensure => installed,
}

service { 'nginx':
  ensure => running,
  enable => true,
}

Bu üç kaynak tek başına bir LAMP stack'in yarısını kurar. ensure parametresi en kritik olanıdır: present/installed var olduğundan emin olur, absent kaldırır, running çalışır durumda tutar. enable servisin boot'ta başlamasını sağlar.

Puppet kaynaklar arası bağımlılıkları otomatik çözer. Nginx config dosyası değiştiğinde servisin restart edilmesi gerektiğini şöyle bildirirsiniz:

file { '/etc/nginx/nginx.conf':
  ensure => file,
  source => 'puppet:///modules/nginx/nginx.conf',
  notify => Service['nginx'],
}

notify metaparametresi, kaynak değiştiğinde bildirim gönderir. subscribe ise tam tersi yönde çalışır: servis, izlediği kaynak değiştiğinde kendini yeniler. Bu ikili, config-management sistemlerinde en çok kullanılan desendir.

Manifest dizini olarak /etc/puppetlabs/code/environments/production/manifests kullanılır. Bu dizindeki tüm .pp dosyaları alfabetik sırayla parse edilir ve tek bir manifest gibi değerlendirilir. site.pp geleneksel giriş noktasıdır.

Hiera: Veriyi Koddan Ayır

Manifestlere doğrudan değer gömmek kısa vadede işe yarar. Yüz node'a ulaştığınızda aynı modülün farklı ortamlarda farklı parametrelerle çalışması gerekir. Hiera bu sorunu çözmek için tasarlandı. YAML tabanlı bir veri katmanı sunar ve hiyerarşik arama yapar.

Örnek hiera.yaml:

---
version: 5
hierarchy:
  - name: "Node-specific data"
    path: "nodes/%{facts.fqdn}.yaml"
  - name: "Environment data"
    path: "%{environment}.yaml"
  - name: "Common data"
    path: "common.yaml"
defaults:
  datadir: "data"
  data_hash: yaml_data

Bu yapıda Puppet, bir node için veri ararken önce node'a özel dosyaya bakar, bulamazsa ortam dosyasına, en son common.yaml'a düşer. Örneğin NTP sunucuları common.yaml'da tanımlıyken, sadece bir node'da farklı NTP kullanmak için nodes/web01.example.com.yaml dosyası oluşturursunuz. Manifest hiç değişmez, sadece veri değişir.

puppet module install puppetlabs/ntp komutu Forge'dan modül indirir. Modül parametreleri Hiera'dan otomatik olarak alınır. hiera_include('classes') fonksiyonu ile common.yaml'daki classes dizisine göre sınıf eklemek/çıkarmak mümkündür. Bu yaklaşım, config-repo pattern'inin temelini oluşturur.

Agent Çalışma Modları

puppet agent --test en sık kullanılan komuttur. Tek seferlik çalışır, verbose log üretir ve çıkış kodu verir. --noop modu dry-run yapar: değişiklikleri uygulamaz, sadece ne yapacağını raporlar. Bu modda çalıştırarak yeni manifestlerin etkisini production'a dokunmadan görebilirsiniz.

Daemon olarak çalışan agent varsayılan olarak 30 dakikada bir katalog çeker. runinterval ayarıyla bu değiştirilebilir. --disable ile agent geçici olarak durdurulabilir. Bu, bakım pencerelerinde Puppet'ın müdahale etmesini engellemek için kullanışlıdır.

# Tek seferlik test
sudo puppet agent --test

# Noop modu
sudo puppet agent --test --noop

# Agent'ı durdur
sudo puppet agent --disable "Bakim penceresi"

# Agent'ı tekrar başlat
sudo puppet agent --enable

Idempotency ve Drift Düzeltme

Puppet'ın en güçlü özelliği idempotency'dir. Aynı manifesti kaç kez uygularsanız uygulayın, sistem aynı durumda kalır. Puppet agent her çalıştığında mevcut durumu katalogla karşılaştırır, sapma varsa düzeltir. Bu süreç drift correction olarak adlandırılır.

Örneğin birisi manuel olarak /etc/ssh/sshd_config dosyasını değiştirdi. Puppet agent bir sonraki çalıştığında dosyanın içeriğinin katalogdaki tanımla uyuşmadığını görür ve orijinal haline geri döndürür. Bu otomatik düzeltme, onlarca node'lu ortamlarda manuel müdahaleleri neredeyse imkansız kılar.

2011'de Puppet Enterprise ile gelen GUI, raporlama ve orchestration özellikleri açık kaynak sürümde yoktur. Açık kaynak sürümde PuppetDB eklenerek raporlama ve inventory genişletilebilir. PuppetDB, agent'lardan gelen fact ve rapor verilerini saklar ve sorgulanabilir hale getirir.

OpenVox ve Topluluk Geleceği

Perforce'un lisans değişikliği sonrası Vox Pupuli topluluğu OpenVox'u başlattı. OpenVox, Puppet'ın açık kaynak kod tabanını koruyarak geliştirilen bir fork. 8.11 sürümü Puppet 8.11 ile aynı özellik setine sahip. Apache 2.0 lisansıyla dağıtılıyor. Facter, Bolt ve rspec-puppet gibi araçlar da OpenFact, OpenBolt gibi isimlerle fork ediliyor.

Debian, Arch ve Foreman gibi projeler OpenVox'a geçiş planlıyor. Yeni projelerde OpenVox kullanmak, uzun vadede topluluk desteğini korumak için mantıklı bir tercih olabilir. Mevcut Puppet kurulumları OpenVox paketleriyle sorunsuz çalışmaya devam eder çünkü komutlar, modüller ve ayarlar aynıdır.

Puppet'ın öğrenme eğrisi Ansible'dan daha dik. Ancak yüzlerce node'un tutarlılığını korumak, drift'i otomatik düzeltmek ve config-data ayrımını Hiera ile yönetmek istiyorsanız Puppet hâlâ en güçlü seçeneklerden biri. Declarative modelin disiplinini kabul eden ekipler için on yıldır en stabil araçlardan biri olmaya devam ediyor.

Laravel-NDFirewall

Laravel için geliştirilmiş; panelsiz, route tabanlı ve hafif bir WAF (Web Application Firewall) kütüphanesidir. RCE, SQLi, XSS ve SSRF saldırılarını tespit eder; girdileri asla çalıştırmaz ve olası ha…

PHP

ctCertWatch

SSL sertifika yayınlarını gerçek zamanlı takip eden bir izleme servisi. Regex filtreleme, DNS çözümleme ve webhook uyarıları ile phishing domainlerini, marka taklidini ve yetkisiz sertifikaları anında…

Rust

ipReconary

IP aralıkları, alt ağlar ve ASN bilgilerine dayalı olarak host, domain ve servis keşfi yapan bir ağ keşif (recon) aracı. Güvenlik uzmanları ve OSINT araştırmacıları için ağ altyapısını hızlı ve güveni…

Rust

Wireguard-Server-Panel

Web arayüzüne sahip, kendi sunucunuzda barındırılan bir WireGuard VPN servisi. İstemci yönetimi, mobil bağlantı için QR kod desteği, gerçek zamanlı trafik istatistikleri ve bağlantı kayıtları sunar. T…

LoadAlertTracker

Sistem yükünü neredeyse hiç kaynak tüketmeden izleyen, hafif bir servis. Belirlenen eşikler aşıldığında Telegram, Discord ve Mattermost gibi platformlara gerçek zamanlı uyarı gönderir.

Rust

Trustsslroot

Tek komutla eksiksiz bir özel PKI yapısı (Kök CA → Ara CA → sunucu ve istemci sertifikaları) oluşturan araç. Farklı formatlarda (p12/bks/jks) paketler üretir ve kullanıma hazır çıktı klasörleri sunar.

Go

DDNS-FW

Değişken IP adresini DDNS üzerinden gerçek zamanlı takip eden, hafif ve güvenilir bir araç. İzin verilen IP listelerini otomatik güncelleyerek kesintisiz erişim ve güvenlik sağlar. Tek dosyadan çalışı…

Rust

Cloudfiltred

Sunucu üzerinde 80/443 portlarına erişimi yalnızca Cloudflare IP aralıklarıyla sınırlandıran, tek dosyadan çalışan bir Linux servisi. Kendini kurar, sistem servisi olarak çalışır ve IP listelerini düz…

Rust

node_exporter

Linux için geliştirilmiş, hafif ve tek dosyadan çalışan, güvenli erişim kontrollü bir sistem metrikleri servisi.

Rust