Puppet Yazı Dizisi 3: Puppet ile Altyapı Yönetimi

Puppet ile Altyapı Yönetimi

puppetBu yazıda Puppet ile altyapınızı yönetirken kullanabileceğiniz gelişmiş Puppet özelliklerinden bahsedilecektir. Öncesinde Puppet ortamınızı kurmuş olmanız gerekmektedir. Eğer halen kurmadıysanız kurulum ile ilgili daha önce yayınlanan yazıya göz atabilirsiniz.

Bir önceki yazıda Puppet ile kullanılan fact’ler, manifest’ler ve modüllerden bahsedilmiş, master sunucu ve agent sunucularda Puppet çalıştırmak için izlenmesi gereken adımlar anlatılmıştır. Eklenen bir kod sonrası agent tarafında nasıl denenmesi gerektiği açıklanmıştır. Bu yazıya başlamadan önce halen okumadıysanız ilgili yazıyı okumanız faydalı olacaktır.

Puppet Terminolojisi

Kaynaklar (Resources)

Herhangi bir Puppet kodu genel anlamda kaynak bildirimlerinden oluşmaktadır. Dolayısıyla kaynaklar Puppet kodlarının temel elemanlarından biridir. Bir Puppet kaynağı, sistemin durumu ile ilgili bilgiler içermektedir. Bu bilgiler bir kullanıcının veya dosyanın oluşturulması veya bir paketin kurulması gibi tanımlardan ibarettir. Kaynak bildirimleri aşağıdaki gibi önce kaynağın tipinin ve isminin belirtildiği, daha sonra gerekli dizilişe uygun özelliklerin sıralandığı bir yapıya sahiptir.

Kullanıcı kaynak tipine örnek bir kaynak bildirimi aşağıda yer almaktadır.

Puppet ile kullanabileceğiniz tüm kaynak türleri aşağıdaki komut ile listelenebilmektedir. 

Bu kaynak türlerini daha önceki yazılarda bahsedildiği gibi hazır modüller ekleyerek çoğaltmak mümkündür.

Manifest Dosyaları

.pp uzantılı Puppet programları “manifest” olarak isimlendirilmektedir. site.pp manifest dosyası hariç tüm manifest’ler bir modül altında yer almaktadır. site.pp ise Puppet altyapısında bulunan sunuculara uygulanacak şablonları içeren, ister tüm sunucular için geçerli olan ve ister sunucu bazında tanım yapılabilen bir formattadır. Puppet agent tarafında periyodik olarak çalıştığında veya merkezi olarak tetiklendiğinde site.pp dosyası içerisinden kendisini ilgilendiren kaynak bildirimlerini alarak istemci tarafında gerekli işlemleri yapmaktadır. Örnek site.pp dosyası aşağıda yer almaktadır.

Sınıflar (Classes)

Puppet sınıfları modüller içerisinde yer alan ve herhangi bir yerden çağırılabilen kod bloklarıdır. Böylece kodun yeniden kullanılması ve manifest’lerin daha kolay okunması sağlanmaktadır. Açıkça kod içerisinden çağırılmadığı sürece çalışmazlar. Bir grup sunucu için tanımlanacak bir işlemi tek tek sunucu isimleri ile manifest dosyasına yazmak yerine bir modül oluşturarak altındaki bir sınıfa gerekli kod yazılarak site.pp dosyasında her sunucu için bu modül altındaki sınıfın kullanılması sağlanabilmektedir. Böylece hem kod tekrar edilmemiş olmakta hem de daha okunabilir hale gelmektedir. Örneğin huseyin modülü altındaki cotuk sınıfının belirlenen sunucu grubu için çalıştırmak üzere cotuk sinifi ilgili modül altında aşağıdaki gibi tanımlanarak site.pp dosyasında belirlenen sunuculara atanması sağlanabilmektedir.

cotuk sınıfını puppet-client, ns1 ve ns2 isimli sunuclara atamak için de site.pp dosyasına aşağıdaki ekleme yapılmalıdır.

Buradaki tanım her sunucu için tek tek yapılabileceği gibi yukarıdaki örnekte olduğu gibi sunucu isimleri virgülle ayrılmak şartıyla birden fazla sunucu için de yapılabilmektedir.

Modüller

Modüller Puppet ile kullanılabilen manifest ve verilerden (fact’ler, dosyalar, şablonlar gibi) oluşan belirlenmiş bir dosya yapısına sahip bileşenlerdir. Puppet kodunun organize edilmesi için önemli rol oynayan modüller sayesinde kod çok sayıda manifest’e bölünerek kullanımı ve anlaşılması kolay bir hale gelmektedir.

Modüller belli bir dosya yapısına sahip olup her dosyanın ilgili hiyerarşik konumda bulunması gerekmektedir. Her modül /etc/puppet/modules dizininde yer almaktadır. Aşağıda Puppet modülleri tarafından kullanılan dosya yapısı verilmiştir.

  • <MODÜL İSMİ>
    • manifests
    • files
    • templates
    • lib
    • facts.d
    • examples
    • spec

Kendi modüllerinizi oluşturup kullanabileceğiniz gibi Puppet Forge sitesinden indirip doğrudan kullanabileceğiniz kullanıma hazır çok sayıda modül bulunmaktadır. Daha önceki yazıda “apache” modülünün indirilmesi ve kullanımı açıklanmıştır.

Örnek bir modül dizin hiyerarşisi aşağıda verilmiştir.

  • huseyin – hiyerarşide en üstte yer alan bu dizin modül ismi ile aynı ismi taşımalıdır.
    • manifests/ – huseyin modülünde yer alan tüm manifest’leri barındıran dizindir.
      • init.pp – Rezerv edilmiş bir isme sahip bu manifest içinde modül ismi ile aynı olan bir sınıf tanımı bulunmalıdır.
      • cotuk.pp – init dışında tanımlanan sınıflar bu şekilde sınıf ismine sahip dosya ismi ile oluşturulmaktadır. cotuk sınıfına erişim için huseyin::cotuk kullanılmalıdır.
      • tanimlanmis_tip.pp – Modül altında tanımlanan tipler manifest klasörü altında yeni bir dosya içerisinde tanımlanabilmektedir. Burada tanımlanan tip’e huseyin::tanimlanmis_tip ile erişilebilmektedir.
      • implementation/ – Örnek olarak oluşturulan bu dizinin ismi altında yer alan sınıflara erişimi etkilemektedir.
        • foo.pp – huseyin::implementation::foo isimli bir sınıf içermelidir.
        • bar.pp – huseyin::implementation::bar isimli bir sınıf içermelidir.
    • files/ – Yönetilen sunucular tarafından indirilmek ve kullanılmak üzere statik içeriğe sahip dosyaların tutulduğu dizindir.
      • settings.conf – Örnek olarak verilen bu dosyaya erişmek için puppet:///modules/huseyin/settings.conf adresi kullanılmalıdır. Dosyanın içeriklerine ayrıca “file” fonksiyonu ile örneğin content => file(‘huseyin/settings.conf’) şeklinde erişilebilmektedir.
    • libs/ – Özel tanımlanan fact’ler, kaynak türleri ve plugin’ler bu dizinde tutulmaktadır. Buradaki dosyalara hem puppet-master sunucusu hem de yönetilen sunucular erişmektedir.
    • facts.d/ – Ruby tabanlı fact’lere alternatif olan external fact’leri barındıran dizindir. Detaylar için ilgili sayfa incelenebilir.
    • templates/ – Modülde bulunan manifest’lerin kullanabileceği şablonları içeren dizindir. Şablonlar içerisinde statik içerik yanında istemciye (yönetilen sunucuya) özel şekilde değişkenler veya fact’ler ile oluşturulan dinamik içerik de yer almaktadır. Detaylar için ilgili sayfa incelenebilir. Puppet (epp) ve Ruby (erb) olmak üzere iki şekilde yazılabilmektedir. Puppet versiyonu Puppet sürümlerine bağlı olmakla birlikte Ruby versiyonu her sürümde çalışabilmektedir.
      • component.erb – Herhangi bir manifest bu şablona  template(‘huseyin/component.erb’) ile erişerek işleyebilmektedir.
      • component.epp – Herhangi bir manifest bu şablona template(‘huseyin/component.epp’) ile erişerek işleyebilmektedir.
    • examples/ – Modüle ait sınıflara ve tiplere nasıl erişelebileceğini ve kullanımını gösteren örneklerin bulunduğu dizindir.
      • init.pp
      • baska_ornek.pp – Kullanım örnekleri yer alabilir.
    • spec/ – lib dizininde bulunan plugin’ler için spec testlerinin yer aldığı dizindir.

Yeni Modül Oluşturma

Puppet içerisinde modül isimleri sadece küçük harflerden, rakamlardan ve alt tire “_” karakterlerinden oluşabilmekte, aynı zamanda arada “-” kullanılarak iki bölüm halinde tanımlanmaktadır. Küçük harfle başlaması gereken modül isimleri [a-z][a-z0-9_]* örüntüsüne sahip olmalıdır. Yeni bir modül oluşturmak için önerilen kullanım şekli modül ismi için “kullanıcı_adı-modul_ismi” şeklindedir. “ubuntu” kullanıcısı ile “ornek” modülünü oluşturmak için aşağıdaki komut kullanılmalıdır. Sorulan sorular uygun şekilde cevaplanmalıdır.

Ardından /etc/puppet/modules/ubuntu-ornek dizini altında oluşturulan modüle ait varsayılan ornek sınıfı manifests dizini altındaki init.pp dosyasında tanımlanmış olacaktır.

Bu sınıf üzerinde istenilen değişiklikler yapılabildiği gibi yeni sınıflar, tipler, şablonlar tanımlanabilmekte ve daha önce bahsedildiği gibi her birine gerekli şekilde erişim sağlanabilmektedir.

init.pp dosyası ilgili modül altında ilk çalıştırılan dosya olup modülün altındaki diğer manifestlere, şablonlara ve her türlü kaynağa çağrıların tanımlandığı bileşendir. Çağırılacak kaynaklar birbiri ile ilişkilendirilmediği durumlarda rastgele sırada çalışacaktır. Bu yüzden hangi sıra ile çağırılmak isteniyorsa bu doğrultuda kaynakların birbiri ile ilişkilendirilmesi gerekmektedir. Bu amaçla aşağıdaki örnekte olduğu gibi “->” operatörü yardımıyla işlenecek sınıfların sırası tanımlanabilmektedir. Bir satırdaki sınıfın işlenmesi bitmeden diğer satıra geçilmemektedir.

Benzer şekilde kaynakların hangi sırada işleneceğini belirtmenin yolu ilgili manifest içerisinde kaynak tanımlarında “require” tanımını kullanmaktır. Eğer bir kaynak işlenmeden önce diğer kaynağın tamamlanmasına ihtiyaç duyuyorsa bu tanımı kullanmak uygun olmaktadır. Aşağıdaki örnekte önce dosya ilgili istemciye gönderilmekte, sıkıştırılmış dosya açılmakta, yükleme sırasında ihtiyaç duyulan kernel header paketi yüklenmekte, ardından sürücü dosyaları yüklenmektedir.

Şablonlar

Modüller içerisinde istemciye özel değişkenleri kullanabilmek amacıyla faydalanılan Puppet bileşenleridir. Her istemcide bir kaynak oluşturmak istendiğinde ve bu kaynak içerisinde istemciye özel IP adresi, sunucu ismi gibi değişkenler bulunduğunda şablonlardan faydalanılmaktadır. Bu durumda bir şablon tanımlayıp içerisinde istemciye özel ve istemcide bulunan facter tarafından kullanılan tüm değişkenlerin kullanılabilmesi mümkün olmaktadır. Kullanıcı tarafından eklenen değişkenler de şablon içerisinden çağırılabilmektedir. Daha önce bahsedildiği gibi şablonlar embedded puppet (EPP) ve embedded ruby (ERB) olmak üzere iki farklı formatta kullanılabilmektedir. Aşağıda ruby formatında bir şablon örneği ve değişkenlerin kullanım şekli yer almaktadır.

Örnekte görüldüğü gibi değişkenler <% ve %> etiketleri arasında kullanılmakta ve hangi istemci üzerinde çalışıyorsa o istemciye ait değerleri kullanmaktadır. Örneğin 10.61.2.117 ip adresine sahip puppet-client isimli istemcide ilgili dosya içeriği aşağıdaki gibi oluşmaktadır.

Bu yazıda kısaca Puppet ile istemci bazında tanım yapma, kendi sınıf, modül ve şablonlarınızı oluşturma aracılığı ile altyapı yönetiminden bahsedilmiştir. Yazı serisinin devamında merkezi istemci yönetimi, mcollective ve foreman gibi araçlardan bahsedilecektir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir