Puppet’a Giriş
Puppet yazı dizisinin bu bölümünde basitçe Puppet’ın nasıl çalıştığı bir kaç basit örnek ile açıklanacaktır. Bunun için temel bir Puppet altyapısının kurulmuş olduğu varsayılacaktır. Eğer henüz kurulum yapmadıysanız bir master ve bir istemci kurulum prosedürünü anlatan daha önce yayınlanan yazıya göz atabilirsiniz.
İçindekiler
Puppet Fact Değişkenleri
Herhangi bir istemcide “puppet apply” komutu ile bir katalog isteği yapılmadan önce Puppet, “facter” isimli araç ile istemcilere ait sistem bilgilerini toplamaktadır. Bu bilgiler Puppet dilinde “fact” olarak isimlendirilmektedir. Toplanan bu bilgiler “manifest” dosyalarında kullanılmak üzere elde edilen ön-tanımlı değişkenlerdir. Puppet “fact” dışında bazı özel değişkenleri de daha sonra kullanılabilmek üzere tanımlamaktadır.
“Facter” aracı, işletim sistemi isimleri, sunucu isimleri, IP adresleri, SSH anahtarları gibi kullanışlı bilgileri toplamaktadır. Ayrıca kendinize özel “fact” değişkenler tanımlamak da mümkündür. Dolayısıyla Puppet tarafından erişilebilecek iki tür fact bulunmaktadır.
- Facter tarafından toplanan çekirdek fact’ler
- Kullanıcı tarafından modüllerde tanımlanan fact’ler
Facter tarafından kullanılan çekirdek fact’lerin listesine buradan erişilebilir. Ayrıca komut satırında aşağıdaki komut ile gerçek zamanlı değişkenlerin değerleri görülebilir.
1 |
facter -p |
İstemciden alınan örnek çıktı aşağıdaki gibidir. SSH anahtarları kısaltılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
architecture => amd64 augeasversion => 1.2.0 blockdevice_vda_size => 107374182400 blockdevice_vda_vendor => 0x1af4 blockdevices => vda domain => vm1.huseyincotuk.com facterversion => 2.4.4 filesystems => ext2,ext3,ext4,vfat fqdn => puppet-client.vm1.huseyincotuk.com gid => ubuntu hardwareisa => x86_64 hardwaremodel => x86_64 hostname => puppet-client id => ubuntu interfaces => eth0,lo ipaddress => 10.61.2.117 ipaddress_eth0 => 10.61.2.117 ipaddress_lo => 127.0.0.1 is_virtual => true kernel => Linux kernelmajversion => 3.13 kernelrelease => 3.13.0-29-generic kernelversion => 3.13.0 lsbdistcodename => trusty lsbdistdescription => Ubuntu 14.04.3 LTS lsbdistid => Ubuntu lsbdistrelease => 14.04 lsbmajdistrelease => 14.04 macaddress => fa:16:3e:fd:62:e4 macaddress_eth0 => fa:16:3e:fd:62:e4 memoryfree => 3.70 GB memoryfree_mb => 3786.59 memorysize => 3.86 GB memorysize_mb => 3953.32 mtu_eth0 => 1500 mtu_lo => 65536 netmask => 255.255.255.0 netmask_eth0 => 255.255.255.0 netmask_lo => 255.0.0.0 network_eth0 => 10.61.2.0 network_lo => 127.0.0.0 operatingsystem => Ubuntu operatingsystemmajrelease => 14.04 operatingsystemrelease => 14.04 os => {"name"=>"Ubuntu", "family"=>"Debian", "release"=>{"major"=>"14.04", "full"=>"14.04"}, "lsb"=>{"distcodename"=>"trusty", "distid"=>"Ubuntu", "distdescription"=>"Ubuntu 14.04.3 LTS", "distrelease"=>"14.04", "majdistrelease"=>"14.04"}} osfamily => Debian partitions => {"vda1"=>{"uuid"=>"b8e63ae8-3db1-4afe-b24b-2f564471b377", "size"=>"192937984", "mount"=>"/", "filesystem"=>"ext4"}, "vda2"=>{"size"=>"2"}, "vda5"=>{"uuid"=>"6899e765-6d43-4183-9118-0d0c80752299", "size"=>"16771072", "filesystem"=>"swap"}} path => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games physicalprocessorcount => 2 processor0 => AMD Opteron 23xx (Gen 3 Class Opteron) processor1 => AMD Opteron 23xx (Gen 3 Class Opteron) processorcount => 2 processors => {"models"=>["AMD Opteron 23xx (Gen 3 Class Opteron)", "AMD Opteron 23xx (Gen 3 Class Opteron)"], "count"=>2, "physicalcount"=>2} ps => ps -ef puppetversion => 3.8.4 rubyplatform => x86_64-linux rubysitedir => /usr/local/lib/site_ruby/1.9.1 rubyversion => 1.9.3 selinux => false sshdsakey => AAAA...m/J sshecdsakey => AAAA...FY= sshed25519key => AAAA...l6 sshfp_dsa => SSHFP 2 1 11...d0 SSHFP 2 2 8b...13 sshfp_ecdsa => SSHFP 3 1 d33...08 SSHFP 3 2 b54...c11 sshfp_ed25519 => SSHFP 4 1 5e7....f5 SSHFP 4 2 b5d...04 sshfp_rsa => SSHFP 1 1 623...64 SSHFP 1 2 7c7...8b sshrsakey => AAAA...td swapfree => 8.00 GB swapfree_mb => 8189.00 swapsize => 8.00 GB swapsize_mb => 8189.00 system_uptime => {"seconds"=>762342, "hours"=>211, "days"=>8, "uptime"=>"8 days"} timezone => EET uniqueid => 3d0a7502 uptime => 8 days uptime_days => 8 uptime_hours => 211 uptime_seconds => 762342 virtual => kvm |
Puppet kodunun içerisinden fact’lere erişmenin iki yolu vardır:
- Klasik şekilde $fact_name ile
- $facts[‘fact_name’] hash ile
1.Yöntem
Bütün fact’ler en üst seviye değişkenlerdir ve manifest dosyaları içerisinden doğrudan $fact_name ile erişilebilirler. Örneğin işletim sistemini kontrol etmek için aşağıdaki kod parçası kullanılabilir.
1 2 3 |
if $osfamily == 'Debian' { # ... } |
Bu yöntemde fact’ler herhangi bir değişken gibi tutulduğu için kod içerisinde kullanılan kısmın fact mi değişken mi olduğu ilk bakışta anlaşılamamaktadır.
2.Yöntem
Tüm fact’ler ayrıca bir $facts hash’inde tutulmaktadır. Herhangi bir fact’e $facts[‘fact_name’] ile erişilebilmektedir. Benzer şekilde işletim sistemi kontorlü aşağıdaki gibi yapılabilmektedir.
1 2 3 |
if $facts['osfamily'] == 'Debian' { # ... } |
Bu yöntemde fact’lerin diğer değişkenlerden ayırt edilmesi mümkün olmakta, böylece kod daha anlaşılır hale gelmektedir.
Puppet Tarafından Eklenen Değişkenler
Facter tarafından toplanan fact’ler dışında bir de Puppet tarafından eklenen değişkenler bulunmaktadır. Bu değişkenler üç kategoride toplanabilir:
- $trusted hash: İstemcinin sertifikasından gelen güvenilen değişkenleri tutar.
- Agent facts: “puppet agent” veya “puppet apply” tarafından set edilen değişkenlerdir.
- Puppet master değişkenleri: Puppet master sunucu tarafından set edilen değişkenlerdir.
- Derleyici değişkenleri: Her scope için özel tanımlanan değişkenlerdir.
Bu değişkenler ile detaylı bilgiye ilgili Puppet sayfasından ulaşabilirsiniz.
Puppet Manifest Dosyaları
Genel anlamda Puppet kodlarından oluşan ve .pp uzantısına sahip olan programlara verilen isimdir. apt paket yöneticisi tarafından yüklenen varsayılan manifest dosyası /etc/puppet/manifests/site.pp lokasyonunda bulunmaktadır.
Her puppet agent, yarım saatlik periyotlarla master sunucu ile haberleşerek kendisine ait güncel fact’leri gönderir, master sunucudan manifest dosyasında belirtilen kendisine ait kataloğu çeker. Agent çalıştığı ve master ile haberleşebildiği sürece bu çevrim bu şekilde devam eder.
Çevrimden önce herhangi bir istemciyi test etmek için aşağıdaki komut kullanılmalıdır.
1 |
puppet agent --test |
Komutun çıktısı aşağıdaki gibi olmalıdır.
1 2 3 4 5 |
Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-client.vm1.huseyincotuk.com Info: Applying configuration version '1452071282' Notice: Finished catalog run in 0.02 seconds |
Bu komut main manifest dosyasındaki komutları test edilen istemciye uygular. Main manifest dışında isteğe bağlı olarak uygulanmak istenen manifest’ler “puppet apply” komutu vasıtasıyla uygulanabilir. Komut ile birlikte kullanılan manifest sadece komutun çalıştığı istemciye uygulanır.
1 |
sudo puppet apply /etc/puppet/modules/test/init.pp |
Bu komut, hazırlanan manifest’in sadece bir kez uygulanması gerektiği durumlarda veya yeni hazırlanan manifest’in istemcide denenmesi gerektiğinde kullanışlı hale gelmektedir.
Basit Bir Manifest Örneği
Puppet manifest’leri temel olarak aşağıdaki bileşenlerden oluşur:
- Dosyalar (files)
- Kaynaklar (resources)
- Şablonlar (templates)
- İstemciler (nodes)
- Sınıflar (classes)
Master sunucuya bağlı tüm istemcilerde çalışması istenilen kodlar main manifest dosyasına yazılırken istemciye veya istemci gruplarına özel yazılan kodlar “puppet apply” komutu ile uygulanabildiği gibi master sunucu üzerinden “puppet kick” komutu ile istemciye gönderilebilmektedir. Bu konu daha sonra ele alınacaktır.
Tüm istemcilerde bir dosya oluşturup bu dosya içerisine ilgili sunucunun ismi ve IP adresini yazan örnek kod main manifest dosyasına eklenmelidir.
1 2 3 4 5 6 |
sudo vi /etc/puppet/manifests/site.pp file {'/tmp/example-ip': # kaynak tipi dosya ve dosya ismi ensure => present, # dosyanin olusturulduguna emin olmak icin mode => 0644, # dosyaya erisim izinleri content => "Bulundugunuz sunucunun adi : $hostname \nSunucu IP Adresi: ${ipaddress_eth0}.\n", # sunucu adi ve ip adresi icin kullanilan factler |
Ardından puppet-client sunucusunda beklemeden manifest’i uygulamak için “puppet apply” çalıştırıldığında aşağıdaki gibi bir çıktı görülmelidir.
1 2 3 4 5 6 7 8 |
puppet agent --test Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-client.vm1.huseyincotuk.com Info: Applying configuration version '1452085915' Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: created Notice: Finished catalog run in 0.05 seconds |
Ardından /tmp altında oluşturulan example-ip isimli dosyanın içeriği kontrol edildiğinde aşağıda olduğu gibi sunucu adı ve IP adresinin alındığı görülebilir.
1 2 3 |
ubuntu@puppet-client:~$ cat /tmp/example-ip Bulundugunuz sunucunun adi : puppet-client Sunucu IP Adresi: 10.61.2.117. |
Manifest’ler içerisinde kullanılan diğer bir bileşen istemcilerdir(nodes). Belli bir istemciye özel işlem yapabilmek için “nodes” direktifi kullanılabilir. Örneğin sadece DNS sunucularında uygulanmak istenen bir işlem için aşağıdaki örneğe benzer bir kod hazırlanmalıdır.
1 2 3 4 5 6 7 8 9 10 11 12 |
sudo vi /etc/puppet/manifests/site.pp ... node 'ns1', 'ns2' { # sadece ns1 ve ns2 sunucularina uygulanmasi icin file {'/tmp/dns': # kaynak tipi dosya ve dosya adi ensure => present, # dosyanin olusturuldugundan emin olmak icin mode => 0644, # dosya erisim izinleri content => "Bulundugunuz sunucu bir DNS sunucusudur.\n", # olusturulan dosyanin icerigi } } node default {} # acikca belirtilmemiş diger istemcilere uygulanacak bolum ... |
Böylece puppet-client, ns1 ve ns2 sunucularında ilk yarım saatlik periyot sonrasında ve “puppet apply –test” komutunun çalıştırılması sonrasında aşağıdaki çıktılar alınmalıdır.
puppet-client sunucusu:
1 2 3 4 5 6 |
ubuntu@puppet-client:~$ sudo puppet agent --test Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for puppet-client.vm1.huseyincotuk.com Info: Applying configuration version '1452087051' Notice: Finished catalog run in 0.02 seconds |
1 2 3 4 5 6 |
ubuntu@puppet-client:~$ cat /tmp/example-ip Bulundugunuz sunucunun adi : puppet-client Sunucu IP Adresi: 10.61.2.117. ubuntu@puppet-client:~$ cat /tmp/dns cat: /tmp/dns: No such file or directory |
Görüldüğü gibi /tmp/dns dosyası sadece ns1 ve ns2 sunucuları için tanımlandığından puppet-client sunucusunda bu dosya oluşturulmamıştır.
ns1 sunucusu:
1 2 3 4 5 6 7 8 9 |
ubuntu@ns1:~$ sudo puppet agent --test Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for ns1.vm1.huseyincotuk.com Info: Applying configuration version '1452087051' Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: created Notice: /Stage[main]/Main/Node[ns1]/File[/tmp/dns]/ensure: created Info: Creating state file /var/lib/puppet/state/state.yaml Notice: Finished catalog run in 0.03 seconds |
1 2 3 4 5 6 |
ubuntu@ns1:~$ cat /tmp/example-ip Bulundugunuz sunucunun adi : ns1 Sunucu IP Adresi: 10.61.2.118. ubuntu@ns1:~$ cat /tmp/dns Bulundugunuz sunucu bir DNS sunucusudur. |
ns2 sunucusu:
1 2 3 4 5 6 7 8 9 10 |
ubuntu@ns2:~$ sudo puppet agent --test Info: Retrieving pluginfacts Info: Retrieving plugin Info: Caching catalog for ns2.vm1.huseyincotuk.com Info: Applying configuration version '1452087051' Notice: /Stage[main]/Main/File[/tmp/example-ip]/ensure: created Notice: /Stage[main]/Main/Node[ns2]/File[/tmp/dns]/ensure: created Info: Creating state file /var/lib/puppet/state/state.yaml Notice: Finished catalog run in 0.10 seconds |
1 2 3 4 5 6 |
ubuntu@ns2:~$ cat /tmp/example-ip Bulundugunuz sunucunun adi : ns2 Sunucu IP Adresi: 10.61.2.119. ubuntu@ns2:~$ cat /tmp/dns Bulundugunuz sunucu bir DNS sunucusudur. |
Puppet Modülleri
Modüller yapılan işleri gruplamak üzere tasarlanmış kullanışlı bileşenlerdir. Puppet community içerisinde kullanıma hazır bir çok modül olduğu gibi kendi modülünüzü yazıp kullanmanız da mümkündür.
Kullanılmak istenilen modülün öncelikle master sunucu üzerinde indirilmesi ve kurulması gerekmektedir.
1 2 3 4 5 6 7 8 9 |
sudo puppet module install puppetlabs-apache Notice: Preparing to install into /etc/puppet/modules ... Notice: Downloading from https://forgeapi.puppetlabs.com ... Notice: Installing -- do not interrupt ... /etc/puppet/modules └─┬ puppetlabs-apache (v1.7.1) ├── puppetlabs-concat (v1.2.5) └── puppetlabs-stdlib (v4.10.0) |
Ardından ilgili manifest dosyası içerisinde modülün kullanacağı istemciye göre ilgili satırlar eklenmelidir. puppet-client sunucusuna apache servisini kurmak için aşağıdaki satırlar eklenebilir.
1 2 3 4 5 6 7 8 9 |
sudo vi /etc/puppet/manifests/site.pp .... node 'puppet-client' { class { 'apache': } # use apache module apache::vhost { 'example.com': # define vhost resource port => '80', docroot => '/var/www/html' } } |
puppet-client sunucusunda değişikliklerin etkili olması aşağıdaki komut çalıştırılmalıdır.
1 |
sudo puppet agent --test |
Apache kurulumunu gösteren uzunca bir çıktının ardından aşağıdaki komut ile servisin durumu kontrol edilebilir.
1 2 |
ubuntu@puppet-client:~$ sudo service apache2 status * apache2 is running |
Modüller ile ilgili daha geniş bilgiyi ilgili Puppet sayfasında bulabilirsiniz.
Puppet ile ilgili yazılarım daha detaylı bilgi ve örnekler ile devam edecek.