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.