Puppet’i CentOS 7 Üzerine Bağımsız (Standalone) Modda Kurulumu ve Yönetimi
Giriş
Günümüzün hızla değişen IT altyapılarında, sunucu konfigürasyonlarını manuel olarak yönetmek hem zaman alıcı hem de hataya açık bir süreçtir. Bu noktada, Konfigürasyon Yönetimi (Configuration Management) araçları devreye girer ve altyapıların otomatik, tutarlı ve ölçeklenebilir bir şekilde yönetilmesini sağlar. Puppet, bu alanda önde gelen ve güçlü bir otomasyon aracıdır. Altyapıyı kod olarak tanımlamanıza olanak tanır, bu da “altyapı kodu” (Infrastructure as Code – IaC) prensibini benimseyerek tekrarlanabilirliği ve sürdürülebilirliği artırır.
Puppet genellikle bir “master-agent” mimarisinde çalışır; burada bir Puppet Master sunucusu, tüm konfigürasyonları merkezi olarak yönetir ve ağ üzerindeki Puppet Agent’lar, bu konfigürasyonları master’dan çekerek kendi sistemlerine uygular. Ancak, her zaman bu karmaşık mimariye ihtiyaç duyulmaz. Özellikle küçük ölçekli ortamlar, test ve geliştirme sunucuları veya tek bir sunucunun belirli bir konfigürasyonla hızlıca ayarlanması gereken durumlar için “bağımsız” (standalone) mod ideal bir çözümdür.
Bu makalede, Puppet’i CentOS 7 işletim sistemi üzerine bağımsız modda nasıl kuracağımızı, temel konfigürasyonları nasıl yapacağımızı, modülleri ve Hiera gibi gelişmiş özellikleri nasıl kullanacağımızı adım adım ele alacağız. CentOS 7, kurumsal ortamlarda yaygın olarak kullanılan stabil ve güvenilir bir Linux dağıtımı olduğu için bu makale için tercih edilmiştir. Amacımız, Puppet’in gücünü master sunucuya ihtiyaç duymadan tek bir sistem üzerinde nasıl kullanabileceğinizi detaylı bir şekilde göstermektir.
Ön Koşullar ve Sistem Gereksinimleri
Puppet kurulumuna başlamadan önce, aşağıdaki ön koşulların yerine getirildiğinden emin olmalısınız:
* CentOS 7 İşletim Sistemi: En az 1 GB RAM ve 1 CPU çekirdeğine sahip, temiz bir CentOS 7 kurulumu önerilir. Sanal makine (VM) veya fiziksel sunucu olabilir.
* Root veya Sudo Yetkisi: Kurulum ve konfigürasyon işlemleri için root kullanıcısı olarak oturum açmış olmalı veya sudo yetkisine sahip bir kullanıcı kullanmalısınız.
* İnternet Bağlantısı: Puppet depolarına ve paketlerine erişim için aktif bir internet bağlantısı gereklidir.
* Sistem Güncellemeleri: En iyi uygulama olarak, sisteme herhangi bir yazılım yüklemeden önce mevcut paketleri güncellemek önemlidir. Bu, potansiyel uyumluluk sorunlarını önler ve sistemin en güncel güvenlik yamalarına sahip olmasını sağlar.
sudo yum update -y
sudo yum upgrade -y
* FQDN (Fully Qualified Domain Name) Ayarı (Önerilen): Her ne kadar standalone modda zorunlu olmasa da, sunucunuz için doğru bir FQDN ayarlamak iyi bir pratiktir ve ileride master-agent mimarisine geçiş yapmayı düşünürseniz sorun yaşamanızı engeller.
* Hostname’i kontrol edin:
hostname -f
* Eğer FQDN doğru ayarlanmamışsa, /etc/hostname dosyasını düzenleyebilir ve /etc/hosts dosyasına IP adresi ile birlikte FQDN’inizi ekleyebilirsiniz:
# /etc/hostname dosyasına FQDN'inizi yazın
echo "sunucum.alanadiniz.com" | sudo tee /etc/hostname
sudo hostname sunucum.alanadiniz.com # Anında uygulamak için
# /etc/hosts dosyasına IP adresinizle birlikte FQDN'inizi ekleyin
# Örneğin, 192.168.1.100 sunucum.alanadiniz.com sunucum
sudo vi /etc/hosts
Puppet’in Çalışma Prensibi (Standalone Mod Özelinde)
Puppet, bildirimsel bir dil kullanarak sistemlerin istenen durumunu tanımlamanıza olanak tanır. Standalone modda bu süreç şu adımlarla özetlenebilir:
* Manifestler (Manifests): Puppet kodunun yazıldığı dosyalardır. Genellikle .pp uzantılıdırlar. Bu dosyalar, bir sistemin hangi paketlerin kurulu olması gerektiğini, hangi servislerin çalışması gerektiğini, hangi dosyaların bulunması gerektiğini vb. tanımlar.
* Kaynaklar (Resources): Puppet dilinin temel yapı taşlarıdır. Bir kaynak, yönetilen bir sistemdeki belirli bir öğeyi (örneğin, bir dosya, bir servis, bir paket, bir kullanıcı) temsil eder. Her kaynağın belirli özellikleri (attributes) vardır (örneğin, dosyanın içeriği, paketin durumu, servisin çalışıp çalışmadığı).
* Bildirimler (Declarations): Bir kaynağın istenen durumunu tanımlayan kod parçalarıdır. Örneğin: package { 'nginx': ensure => installed, } Nginx paketinin “kurulu” durumda olmasını bildiren bir deklarasyondur.
* Facter: Puppet ile birlikte gelen bir araçtır. Sistem hakkında donanım bilgileri, işletim sistemi versiyonu, IP adresleri gibi gerçek zamanlı bilgileri toplar. Bu bilgiler, manifestlerde koşullu mantık veya veri ayrıştırma için kullanılabilir.
* Uygulama Süreci: Standalone modda, puppet apply komutu kullanılır. Bu komut, belirtilen manifest dosyasını okur, Facter aracılığıyla sistemin mevcut durumunu toplar, manifestte tanımlanan istenen durum ile mevcut durumu karşılaştırır ve gerekli değişiklikleri yaparak sistemi istenen duruma getirir.
Puppet Kurulumu
Bu bölümde, Puppet paketini CentOS 7 sistemine nasıl kuracağımızı adım adım göreceğiz.
Puppet Deposunu Eklemek
Puppet paketleri, CentOS’un varsayılan depolarında bulunmaz. Bu nedenle, öncelikle Puppet’in kendi yum deposunu sistemimize eklememiz gerekir. Bu, yum paket yöneticisinin Puppet paketlerini bulmasını ve kurmasını sağlayacaktır. Puppet’in en son kararlı sürümünü (bu makalenin yazıldığı an itibarıyla Puppet 7) kullanacağız.
sudo yum install -y https://yum.puppet.com/puppet7-release-el-7.noarch.rpm
Bu komut, Puppet 7’nin depo tanım dosyasını indirir ve sisteminize kurar. Kurulum tamamlandıktan sonra, deponun başarıyla eklendiğini kontrol edebilirsiniz:
sudo yum repolist | grep puppet
Çıktıda puppet7 veya benzeri bir depo adı görmelisiniz, bu da deponun başarıyla eklendiğini gösterir.
Puppet Paketini Kurmak
Depo eklendikten sonra, puppet-agent paketini kurabiliriz. puppet-agent paketi, Puppet’i çalıştırmak için gerekli tüm bileşenleri (Puppet dil yorumlayıcısı, Facter, Hiera vb.) içerir.
sudo yum install -y puppet-agent
Kurulum biraz zaman alabilir. Tamamlandığında, Puppet’in kurulu olup olmadığını ve hangi sürümün yüklendiğini kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
puppet --version
Çıktıda 7.x.x gibi bir sürüm numarası görmelisiniz.
Ortam Değişkenlerini Ayarlamak (PATH)
Puppet, varsayılan olarak /opt/puppetlabs/bin dizinine kurulur. Bu dizin, Puppet komut dosyalarını (örneğin puppet, facter, hiera) içerir. Ancak, bu dizin genellikle sisteminizin PATH ortam değişkeninde tanımlı değildir. Bu da her seferinde tam yolu yazmak zorunda kalacağınız anlamına gelir (/opt/puppetlabs/bin/puppet --version). Daha kolay kullanım için bu dizini PATH‘e eklemek iyi bir uygulamadır.
Aşağıdaki komut, puppet.sh adında bir dosya oluşturur ve bu dosyayı /etc/profile.d/ dizinine yerleştirir. Bu dizindeki dosyalar, her yeni oturum açıldığında otomatik olarak kaynaklanır (source edilir), böylece Puppet’in bin dizini PATH‘e eklenir.
echo 'export PATH=$PATH:/opt/puppetlabs/bin' | sudo tee /etc/profile.d/puppet.sh
Değişikliğin mevcut oturumunuzda hemen geçerli olması için aşağıdaki komutu çalıştırın:
source /etc/profile.d/puppet.sh
Artık puppet komutunu doğrudan kullanabilirsiniz:
puppet --version
Puppet ile İlk Konfigürasyon
Puppet kurulduktan sonra, ilk manifest dosyamızı oluşturarak basit bir konfigürasyon uygulayalım. Bu örnekte, bir metin dosyası oluşturacak, Nginx paketini kuracak ve Nginx servisini başlatacağız.
Basit Bir Manifest Oluşturmak
Puppet, manifest dosyalarını belirli bir dizin yapısı içinde arar. Standalone modda, genellikle /etc/puppetlabs/code/environments/production/manifests/ dizinini kullanırız. Önce bu dizinleri oluşturalım:
sudo mkdir -p /etc/puppetlabs/code/environments/production/manifests
Şimdi site.pp adında bir manifest dosyası oluşturalım ve içine Puppet kodumuzu yazalım:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
Dosyanın içine aşağıdaki içeriği yapıştırın:
# /etc/puppetlabs/code/environments/production/manifests/site.pp
1. Bir dosya oluşturma
file { '/tmp/merhaba_puppet.txt':
ensure => file,
content => "Puppet standalone modda başarıyla çalışıyor!\nBu dosya Puppet tarafından oluşturuldu ve yönetiliyor.\n",
mode => '0644',
owner => 'root',
group => 'root',
}
2. Nginx paketini kurma
package { 'nginx':
ensure => installed,
}
3. Nginx servisini başlatma ve sistem başlangıcında aktif etme
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'], # Nginx paketi kurulmadan servis başlatılmasın
}
4. Firewalld üzerinden Nginx portunu (80) açma
Firewalld servisi çalışıyor olmalı
firewalld_port { 'http_port':
ensure => present,
port => 80,
protocol => 'tcp',
zone => 'public',
permanent => true, # Kalıcı olarak ekle
before => Service['nginx'], # Nginx servisi başlamadan önce port açılsın
}
Firewalld servisini yeniden yükle (değişiklikleri uygulamak için)
exec { 'firewall_reload':
command => 'firewall-cmd --reload',
path => ['/usr/bin', '/bin'],
refreshonly => true, # Sadece tetiklendiğinde çalışır
subscribe => Firewalld_port['http_port'], # Port değişikliğinde tetiklenir
}
Yukarıdaki kodda:
* file kaynağı, /tmp/merhaba_puppet.txt adında bir dosya oluşturur, içine belirli bir metin yazar ve dosya izinlerini ayarlar.
* package kaynağı, nginx paketinin sistemde installed (kurulu) durumda olmasını sağlar. Eğer kurulu değilse kurar.
* service kaynağı, nginx servisinin running (çalışır) durumda olmasını ve sistem başlangıcında enable (aktif) edilmesini sağlar. require => Package['nginx'] ifadesi, Puppet’e önce Nginx paketinin kurulması gerektiğini söyler.
* firewalld_port kaynağı (bu bir Puppet Forge modülünden gelir, bu nedenle kurulmamışsa hata verebilir, şimdilik yorum satırı yapabilirsiniz veya daha sonra modül kurulumunu bekleyebilirsiniz. Makale akışında Forge modül kurulumu anlatılacak.), Firewalld servisi üzerinden 80 numaralı portu TCP protokolü ile public bölgesine kalıcı olarak ekler. before ifadesi, bu portun Nginx servisi başlamadan önce açılmasını sağlar.
* exec kaynağı, Firewalld’ı yeniden yükleyerek port değişikliğinin uygulanmasını sağlar. subscribe ifadesi, firewalld_port kaynağında bir değişiklik olduğunda bu exec kaynağının tetiklenmesini sağlar.
Not: firewalld_port kaynağını kullanabilmek için puppetlabs-firewall modülünün kurulu olması gerekir. Eğer bu modülü kurmadıysanız, bu kısmı yorum satırı yapın veya ileride modül kurulumu bölümünde nasıl kurulacağını öğrendikten sonra ekleyin. İlk deneme için bu kısmı şimdilik pas geçebiliriz.
Manifesti Uygulamak
Manifest dosyasını kaydettikten sonra, Puppet’in bu konfigürasyonu sistemimize uygulamasını sağlayabiliriz:
sudo puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
Komutu çalıştırdığınızda, Puppet sistemin mevcut durumunu analiz edecek ve manifestte belirtilen istenen duruma ulaşmak için gerekli değişiklikleri yapacaktır. Çıktıda yapılan değişiklikler listelenecektir.
Uygulama öncesi ne gibi değişiklikler yapılacağını görmek isterseniz, --noop (no operation) veya --dry-run bayrağını kullanabilirsiniz:
sudo puppet apply --noop /etc/puppetlabs/code/environments/production/manifests/site.pp
Bu komut, gerçek değişiklik yapmadan sadece ne olacağını gösterir.
Uygulama sonrası, yapılan değişiklikleri kontrol edelim:
* Dosyanın oluşturulup oluşturulmadığını kontrol edin:
ls -l /tmp/merhaba_puppet.txt
cat /tmp/merhaba_puppet.txt
* Nginx paketinin kurulu olup olmadığını kontrol edin:
sudo yum list installed | grep nginx
* Nginx servisinin çalışıp çalışmadığını kontrol edin:
sudo systemctl status nginx
Eğer firewalld_port kısmını eklediyseniz ve puppetlabs-firewall modülünü kurduysanız, 80 portunun açık olup olmadığını da kontrol edebilirsiniz:
sudo firewall-cmd --list-all
Bir web tarayıcısından sunucunuzun IP adresine giderek Nginx’in varsayılan karşılama sayfasını görmelisiniz.
Modüllerin Kullanımı
Puppet modülleri, Puppet kodunu düzenli ve yeniden kullanılabilir bir yapıda tutmanın temel yoludur. Modüller, belirli bir bileşeni (örneğin Apache, MySQL, bir kullanıcı yönetimi) yönetmek için gerekli tüm Puppet kodunu, şablonları, dosyaları ve eklentileri bir araya getirir.
Modül Nedir ve Neden Kullanılır?
* Yeniden Kullanılabilirlik: Aynı konfigürasyon parçalarını farklı sunucularda veya farklı projelerde tekrar tekrar kullanmanızı sağlar.
* Kod Organizasyonu: Büyük ve karmaşık konfigürasyonları daha küçük, yönetilebilir parçalara ayırır.
* Topluluk Desteği: Puppet Forge (forge.puppet.com) üzerinden binlerce hazır modüle erişebilir, bu modülleri kullanarak zamandan tasarruf edebilir ve kanıtlanmış çözümlerden faydalanabilirsiniz.
* Sürdürülebilirlik: Modüller, kodunuzu daha kolay okunur, anlaşılır ve bakımı yapılabilir hale getirir.
Bir Puppet modülünün temel dizin yapısı şöyledir:
mymodule/
├── manifests/ # Puppet sınıfları ve tanımları (.pp dosyaları)
│ └── init.pp # Ana sınıf (mymodule::init)
├── files/ # Statik dosyalar (örneğin, konfigürasyon dosyaları)
├── templates/ # Şablon dosyaları (.erb uzantılı), dinamik içerik oluşturmak için
├── lib/ # Özel Facter eklentileri, türler ve sağlayıcılar
└── metadata.json # Modül hakkında meta veriler
Standalone modda, modüller genellikle /etc/puppetlabs/code/environments/production/modules/ dizinine yerleştirilir.
Basit Bir Modül Oluşturmak
Şimdi kendi modülümüzü oluşturalım. Bu modül, sistemde yeni bir kullanıcı oluşturacak ve bu kullanıcının ana dizinine bir hoş geldiniz dosyası yerleştirecektir.
Önce modül dizin yapısını oluşturalım:
sudo mkdir -p /etc/puppetlabs/code/environments/production/modules/mymodule/{manifests,files,templates}
Şimdi mymodule‘ün ana manifest dosyasını (init.pp) oluşturalım:
sudo vi /etc/puppetlabs/code/environments/production/modules/mymodule/manifests/init.pp
Dosyanın içine aşağıdaki içeriği yapıştırın:
# /etc/puppetlabs/code/environments/production/modules/mymodule/manifests/init.pp
class mymodule {
# Yeni bir kullanıcı oluşturma
user { 'puppetuser':
ensure => present,
home => '/home/puppetuser',
managehome => true, # Ana dizini oluştur
# password => '$6$saltsalt$hashedpassword', # Gerçek bir şifre hash'i kullanın veya şifresiz bırakın
shell => '/bin/bash',
}
# Kullanıcının ana dizinine bir hoş geldiniz dosyası oluşturma
file { '/home/puppetuser/welcome.txt':
ensure => file,
content => "Merhaba, puppetuser! Bu dosya 'mymodule' tarafından oluşturuldu.\n",
owner => 'puppetuser',
group => 'puppetuser',
mode => '0644',
require => User['puppetuser'], # Kullanıcı oluşturulmadan dosya oluşturulmasın
}
}
Bu modül, puppetuser adında bir kullanıcı oluşturur ve /home/puppetuser/welcome.txt dosyasına bir karşılama mesajı yazar. require => User['puppetuser'] ifadesi, Puppet’e dosyanın oluşturulmadan önce kullanıcının var olması gerektiğini bildirir.
Güvenlik Notu: password özniteliği için düz metin şifreler kullanmaktan kaçının. Bunun yerine, mkpasswd -m sha-512 gibi bir araçla oluşturulmuş bir hash kullanın veya tamamen şifresiz bırakın.
Modülü Manifestten Çağırmak
Oluşturduğumuz mymodule‘ü ana site.pp manifest dosyamızdan çağırarak uygulayabiliriz. site.pp dosyasını düzenleyelim:
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
Dosyanın sonuna aşağıdaki satırı ekleyin:
# /etc/puppetlabs/code/environments/production/manifests/site.pp
... (önceki konfigürasyonlar) ...
Kendi modülümüzü dahil etme
include mymodule
Şimdi manifesti tekrar uygulayın:
sudo puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
Uygulama sonrası kontrol:
* Kullanıcının oluşturulup oluşturulmadığını kontrol edin:
id puppetuser
* Hoş geldiniz dosyasının oluşturulup oluşturulmadığını kontrol edin:
ls -l /home/puppetuser/welcome.txt
cat /home/puppetuser/welcome.txt
Puppet Forge’dan Modül İndirmek
Puppet Forge (forge.puppet.com), Puppet modüllerinin merkezi bir deposudur. Binlerce hazır modül bulunur ve bunları puppet module install komutuyla kolayca sisteminize indirebilirsiniz.
Daha önce firewalld_port kaynağını kullanabilmek için puppetlabs-firewall modülüne ihtiyacımız olduğunu belirtmiştik. Şimdi bu modülü Puppet Forge’dan indirelim:
sudo puppet module install puppetlabs-firewall
Bu komut, puppetlabs-firewall modülünü otomatik olarak /etc/puppetlabs/code/environments/production/modules/ dizinine indirecektir.
Modül indirildikten sonra, site.pp dosyanızdaki firewalld_port ve exec kaynaklarının yorum satırlarını kaldırabilir ve manifesti tekrar uygulayarak Firewalld konfigürasyonunu aktif edebilirsiniz.
sudo puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
Artık Firewalld portu da Puppet tarafından yönetiliyor olmalıdır.
Gelişmiş Konfigürasyon ve İyi Uygulamalar
Puppet’i daha etkili kullanmak için bazı gelişmiş teknikler ve iyi uygulamalar mevcuttur.
Hiera ile Veri Yönetimi
Hiera, konfigürasyon verilerini Puppet kodundan ayırmanıza olanak tanıyan bir anahtar/değer arama sistemidir. Bu, aynı Puppet kodunu farklı ortamlarda (geliştirme, test, üretim) veya farklı sunucularda farklı verilerle kullanmanızı sağlar. Örneğin, bir web sunucusunun port numarasını veya bir veritabanı bağlantı dizesini Hiera’da tanımlayabilir ve Puppet kodunda bu değeri çağırabilirsiniz.
Hiera, belirli bir hiyerarşi (örneğin, sunucu adına göre, işletim sistemine göre, ortama göre) kullanarak en uygun veriyi bulur.
Hiera’yı Yapılandırmak:
Hiera’nın yapılandırma dosyası /etc/puppetlabs/code/environments/production/hiera.yaml konumunda bulunur. Önce bu dosyayı oluşturalım:
sudo vi /etc/puppetlabs/code/environments/production/hiera.yaml
İçine aşağıdaki içeriği yapıştırın:
# /etc/puppetlabs/code/environments/production/hiera.yaml
---
version: 5
defaults:
data_hash: yaml_data
datadir: data
hierarchy:
- name: "Common data"
path: "common.yaml"
Bu yapılandırma, Hiera’ya veri dosyalarını /etc/puppetlabs/code/environments/production/data/ dizininde aramasını ve common.yaml dosyasını kullanmasını söyler.
Şimdi data dizinini ve common.yaml dosyasını oluşturalım:
sudo mkdir -p /etc/puppetlabs/code/environments/production/data
sudo vi /etc/puppetlabs/code/environments/production/data/common.yaml
İçine aşağıdaki örnek veriyi ekleyin:
# /etc/puppetlabs/code/environments/production/data/common.yaml
---
my_custom_message: "Bu mesaj Hiera'dan geliyor. Hoş geldiniz!"
nginx_port: 8080
Hiera Verisini Manifestte Kullanmak:
site.pp dosyamızı düzenleyerek Hiera’dan gelen veriyi kullanalım. Örneğin, /tmp/merhaba_puppet.txt dosyasının içeriğini Hiera’dan alalım ve Nginx’in dinleyeceği portu değiştirelim (bunun için Nginx konfigürasyonunu da değiştirmemiz gerekir, sadece örnek olarak portu almayı gösteriyoruz).
sudo vi /etc/puppetlabs/code/environments/production/manifests/site.pp
file kaynağını ve Nginx service kaynağını aşağıdaki gibi güncelleyin:
# /etc/puppetlabs/code/environments/production/manifests/site.pp
... (diğer konfigürasyonlar) ...
1. Bir dosya oluşturma (içeriği Hiera'dan al)
file { '/tmp/merhaba_puppet.txt':
ensure => file,
content => hiera('my_custom_message'), # Hiera'dan veri çekme
mode => '0644',
owner => 'root',
group => 'root',
}
Nginx servisinin dinleyeceği portu Hiera'dan alabiliriz (örnek)
Gerçekte Nginx konfigürasyonunu da güncellemeniz gerekir.
Bunun için bir Nginx modülü veya template kullanmak daha iyidir.
Bu sadece Hiera kullanımını göstermek amaçlıdır.
$nginx_listen_port = hiera('nginx_port')
notify { "Nginx Port": message => "Nginx ${nginx_listen_port} portunda dinleyecek." }
... (diğer konfigürasyonlar) ...
Manifesti uygulayın:
sudo puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp
Dosyanın içeriğini kontrol edin:
cat /tmp/merhaba_puppet.txt
Çıktıda “Bu mesaj Hiera’dan geliyor. Hoş geldiniz!” yazısını görmelisiniz. Hiera, konfigürasyonlarınızı daha esnek ve yönetilebilir hale getirmenin güçlü bir yoludur.
Otomatik Uygulama (Cron ile)
Standalone modda, Puppet manifestlerinizi düzenli aralıklarla otomatik olarak uygulamak isteyebilirsiniz. Bunun en basit yolu bir cron işi (cron job) kullanmaktır.
Aşağıdaki örnek, Puppet manifestini her 4 saatte bir uygulayacak bir cron işi oluşturur:
sudo crontab -e
Açılan editöre aşağıdaki satırı ekleyin:
0 /4 /opt/puppetlabs/bin/puppet apply /etc/puppetlabs/code/environments/production/manifests/site.pp --modulepath=/etc/puppetlabs/code/environments/production/modules --logdest syslog
0 /4 *: Her 4 saatte bir (saat 0, 4, 8, 12, 16, 20’de) çalışır.
* /opt/puppetlabs/bin/puppet apply ...: Puppet uygulama komutu.
* --modulepath: Modüllerin nerede bulunacağını belirtir. Bu, Puppet’in modülleri doğru bir şekilde bulmasını sağlar.
* --logdest syslog: Puppet çıktısını syslog’a yönlendirir, böylece /var/log/messages veya journalctl ile kontrol edebilirsiniz.
Bu, sistemin konfigürasyonunun düzenli olarak kontrol edilmesini ve istenen durumda kalmasını sağlar.
Versiyon Kontrolü (Git)
Puppet manifestlerinizi ve modüllerinizi bir versiyon kontrol sistemi (örneğin Git) ile yönetmek, iyi bir uygulamadır. Bu, kodunuzun geçmişini takip etmenizi, değişiklikleri geri almanızı, farklı versiyonlar arasında geçiş yapmanızı ve ekip üyeleriyle işbirliği yapmanızı sağlar.
Puppet kodunuzu bir Git deposunda tutarak, değişiklikleri merkezi olarak yönetebilir ve sunucularınıza dağıtabilirsiniz.
Idempotence (Tekrarlanabilirlik)
Puppet’in temel prensiplerinden biri idempotence’dir. Bu, aynı Puppet manifestini birden çok kez çalıştırdığınızda, sistem üzerinde yalnızca ilk çalıştırmada değişiklik yapılması ve sonraki çalıştırmaların (sistem zaten istenen durumdaysa) herhangi bir ek yan etki yaratmaması anlamına gelir. Puppet, sadece gerekli değişiklikleri yapar. Bu, manuel müdahaleyi azaltır ve sistemlerin tutarlılığını garanti eder.
Test Ortamı
Herhangi bir konfigürasyon değişikliğini üretim ortamına uygulamadan önce bir test ortamında denemek kritik öneme sahiptir. Standalone Puppet, bu tür bir test ortamını hızlıca kurmak için mükemmel bir araçtır. Sanal makineler veya konteynerler üzerinde Puppet ile konfigüre edilmiş bir test ortamı oluşturarak, değişikliklerinizi güvenle test edebilirsiniz.
Sorun Giderme ve İpuçları
Puppet ile çalışırken karşılaşabileceğiniz bazı yaygın sorunlar ve çözüm ipuçları:
* Sözdizimi Hataları: Puppet kodu yazarken sıkça sözdizimi hataları yapılabilir. Manifest dosyanızı uygulamadan önce doğrulamak için puppet parser validate komutunu kullanın:
sudo puppet parser validate /etc/puppetlabs/code/environments/production/manifests/site.pp
Eğer hata yoksa boş bir çıktı verir, aksi takdirde hatanın yerini ve türünü belirtir.
* Logları Kontrol Etme: Puppet çalıştırdığında, çıktıları terminalde gösterir. Ancak daha detaylı bilgi için veya cron ile çalıştırdığınızda logları kontrol etmeniz gerekebilir.
* --logdest syslog kullandığınızda, sistem loglarını kontrol edin:
sudo journalctl -xe | grep puppet
sudo tail -f /var/log/messages | grep puppet
* Daha fazla detay için --debug veya --verbose bayraklarını kullanın:
sudo puppet apply --debug /etc/puppetlabs/code/environments/production/manifests/site.pp
* Modül Bulunamadı Hatası: Eğer Error: Could not find class ::mymodule gibi bir hata alırsanız, site.pp dosyasında modül adını doğru yazdığınızdan ve modülün /etc/puppetlabs/code/environments/production/modules/ dizini altında doğru bir şekilde konumlandırıldığından emin olun. puppet apply komutunda --modulepath bayrağını doğru kullandığınızdan emin olun.
* İzin Hataları: Puppet’in bir dosyayı yazma veya bir servisi başlatma izni olmadığında hatalar alabilirsiniz. Puppet genellikle root ayrıcalıklarıyla çalışır, ancak yine de dosya veya dizin izinlerini kontrol etmek faydalı olabilir.
* Puppet Forge Modülü Bağımlılıkları: İndirdiğiniz bir Forge modülü, başka bir modüle bağımlı olabilir. puppet module install komutu genellikle bu bağımlılıkları otomatik olarak çözer, ancak bazen manuel müdahale gerekebilir. Modülün metadata.json dosyasını kontrol ederek bağımlılıkları görebilirsiniz.
Sonuç ve Gelecek Adımlar
Bu makalede, Puppet’i CentOS 7 üzerine bağımsız (standalone) modda nasıl kuracağımızı ve yöneteceğimizi detaylı bir şekilde öğrendik. Basit bir manifest oluşturmaktan, kendi modüllerimizi yazmaya, Puppet Forge’dan modül indirmeye ve Hiera ile veri yönetimine kadar birçok temel konuyu ele aldık. Ayrıca, Puppet’in çalışma prensiplerini, iyi uygulamalarını ve sorun giderme ipuçlarını da inceledik.
Standalone Puppet, özellikle küçük ölçekli altyapılar, geliştirme ortamları veya hızlı testler için son derece kullanışlı ve güçlü bir araçtır. Bir Puppet Master sunucusunun kurulum ve bakım karmaşıklığı olmadan konfigürasyon yönetiminin avantajlarından yararlanmanızı sağlar.
Gelecek Adımlar:
* Puppet Master-Agent Mimarisi: İhtiyaçlarınız büyüdükçe ve birden fazla sunucuyu yönetmeniz gerektiğinde, Puppet Master-Agent mimarisine geçiş yapmayı düşünebilirsiniz. Bu, merkezi yönetim, raporlama ve sertifika tabanlı güvenli iletişim gibi ek avantajlar sunar.
* Gelişmiş Puppet DSL: Puppet’in kendi alanına özgü dili (DSL) hakkında daha derinlemesine bilgi edinin. Koşullu ifadeler, döngüler, fonksiyonlar ve özel türler gibi gelişmiş özellikleri öğrenmek, daha karmaşık ve dinamik konfigürasyonlar yazmanıza olanak tanır.
* Puppet Forge Modüllerini Keşfedin: Puppet Forge’da, işletim sistemi, web sunucuları, veritabanları, izleme araçları gibi birçok farklı uygulama ve hizmet için yüzlerce hazır modül bulunmaktadır. Bu modülleri keşfetmek, kendi kodunuzu yazma ihtiyacını azaltır ve kanıtlanmış çözümlerden faydalanmanızı sağlar.
* Vagrant veya Docker ile Geliştirme: Puppet kodunuzu yerel makinenizde Vagrant (sanal makineler için) veya Docker (konteynerler için) ile entegre ederek, hızlı ve izole bir geliştirme ve test ortamı oluşturabilirsiniz.
* Puppet Enterprise: Büyük ölçekli kurumsal ortamlar için Puppet Enterprise (PE), Puppet Master’a ek olarak gelişmiş raporlama, görselleştirme, rol tabanlı erişim kontrolü ve orkestrasyon gibi özellikler sunar.
Puppet, altyapı yönetiminizi otomatikleştirerek zaman kazandıran ve hataları azaltan güçlü bir araçtır. Bu makaledeki bilgilerle, Puppet ile konfigürasyon yönetiminin ilk adımlarını atmış bulunuyorsunuz. Pratik yaparak ve Puppet topluluğunun kaynaklarından faydalanarak bilginizi sürekli geliştirebilirsiniz.