Puppet - Canlı Proje
Puppet node üzerinde yapılandırma ve manifestoların uygulanmasının canlı testini gerçekleştirmek için, canlı bir çalışma demosu kullanacağız. Bu, yapılandırmanın nasıl çalıştığını test etmek için doğrudan kopyalanıp yapıştırılabilir. Kullanıcı aynı kod setini kullanmak isterse, aşağıdaki kod parçacıklarında gösterilenle aynı adlandırma kuralına sahip olması gerekir.
Yeni bir modül oluşturmakla başlayalım.
Yeni Bir Modül Oluşturmak
Httpd yapılandırmasını test etmek ve uygulamak için ilk adım, bir modül oluşturmaktır. Bunu yapabilmek için kullanıcının çalışma dizinini Kukla modül dizinine değiştirmesi ve temel bir modül yapısı oluşturması gerekir. Yapı oluşturma işlemi manuel olarak veya modül için şablon oluşturmak için Puppet kullanılarak yapılabilir.
# cd /etc/puppet/modules
# puppet module generate Live-module
Note - Puppet modül oluşturma komutu, modül adının Puppet forge spesifikasyonlarına uyması için [kullanıcı adı] - [modül] formatını almasını gerektirir.
Yeni modül, bir bildirim dizini dahil olmak üzere bazı temel dosyaları içerir. Dizin zaten modüller ana bildirim dosyası olan init.pp adında bir bildirim içeriyor. Bu, modül için boş bir sınıf bildirimidir.
class live-module {
}
Modül ayrıca adında bir bildirimi içeren bir test dizini içerir. init.pp. Bu test bildirimi, manifest / init.pp içindeki canlı modül sınıfına başvuru içerir:
include live-module
Puppet, bildiriyi test etmek için bu test modülünü kullanacak. Şimdi konfigürasyonu modüle eklemeye hazırız.
HTTP Sunucusunun Kurulması
Puppet modülü, http sunucusunu çalıştırmak için gerekli paketleri kuracaktır. Bu, httpd paketlerinin konfigürasyonunu tanımlayan bir kaynak tanımı gerektirir.
Modülün bildirim dizininde, httpd.pp adında yeni bir bildirim dosyası oluşturun.
# touch test-module/manifests/httpd.pp
Bu bildirim, modülümüz için tüm HTTP yapılandırmasını içerecektir. Ayırma amacıyla, httpd.pp dosyasını init.pp bildirim dosyasından ayrı tutacağız.
Aşağıdaki kodu httpd.pp manifest dosyasına koymamız gerekiyor.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
}
Bu kod, test modülünün httpd adlı bir alt sınıfını tanımlar, ardından httpd paketi için bir paket kaynak bildirimi tanımlar. Sure => installed özniteliği, gerekli paketin kurulu olup olmadığını kontrol eder. Puppet kurulmamışsa, kurmak için yum yardımcı programını kullanır. Sonra, bu alt sınıfı ana manifest dosyamıza dahil etmektir. İnit.pp bildirimini düzenlememiz gerekiyor.
class test-module {
include test-module::httpd
}
Şimdi, aşağıdaki gibi yapılabilecek modülü test etme zamanı.
# puppet apply test-module/tests/init.pp --noop
Puppet apply komutu, hedef sistemdeki manifest dosyasında bulunan konfigürasyonu uygular. Burada, main init.pp'yi ifade eden test init.pp'yi kullanıyoruz. –Noop, yapılandırmanın yalnızca çıktıyı gösteren, ancak gerçekte hiçbir şey yapmayan kuru çalışmasını gerçekleştirir.
Aşağıdaki çıktıdır.
Notice: Compiled catalog for puppet.example.com in environment
production in 0.59 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 1
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.67 seconds
Vurgu çizgisi, garantiye => kurulu özniteliğinin sonucudur. Current_value yok, Puppet'in httpd paketinin kurulu olduğunu algıladığı anlamına gelir. –Noop seçeneği olmadan Puppet httpd paketini kuracaktır.
Httpd Sunucusunu Çalıştırmak
Httpd sunucularını kurduktan sonra, diğer kaynak yavaşlamalarını kullanarak hizmeti başlatmamız gerekir: Hizmet
Httpd.pp manifest dosyasını düzenlememiz ve aşağıdaki içeriği düzenlememiz gerekir.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
}
Yukarıdaki koddan elde ettiğimiz hedeflerin listesi aşağıdadır.
ensure => çalıştırma durumu hizmetin çalışıp çalışmadığını kontrol eder, çalışmıyorsa etkinleştirir.
enable => true özniteliği, hizmeti sistem başlatıldığında çalışacak şekilde ayarlar.
require => Package["httpd"]öznitelik, bir kaynak yavaşlaması ile diğeri arasındaki bir sıralama ilişkisini tanımlar. Yukarıdaki durumda httpd servisinin http paketi kurulduktan sonra başlamasını sağlar. Bu, hizmet ve ilgili paket arasında bir bağımlılık yaratır.
Değişiklikleri tekrar test etmek için kukla uygulama komutunu çalıştırın.
# puppet apply test-module/tests/init.pp --noop
Notice: Compiled catalog for puppet.example.com in environment
production in 0.56 seconds
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 2
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.41 seconds
Httpd Sunucusunu Yapılandırma
Yukarıdaki adımlar tamamlandıktan sonra, HTTP sunucusunu kurup etkinleştireceğiz. Sonraki adım, sunucuya bazı yapılandırmalar sağlamaktır. Varsayılan olarak httpd, /etc/httpd/conf/httpd.conf adresinde bir web barındırma portu 80 sağlayan bazı varsayılan yapılandırmalar sağlar. Web barındırıcısına bazı kullanıcıya özgü özellikler sağlamak için bazı ek ana bilgisayar ekleyeceğiz.
Değişken bir giriş gerektirdiğinden ek bağlantı noktası sağlamak için bir şablon kullanılacaktır. Template adında bir dizin oluşturup yeni yönetici içerisine test-server.config.erb adlı bir dosya ekleyip aşağıdaki içeriği ekleyeceğiz.
Listen <%= @httpd_port %>
NameVirtualHost *:<% = @httpd_port %>
<VirtualHost *:<% = @httpd_port %>>
DocumentRoot /var/www/testserver/
ServerName <% = @fqdn %>
<Directory "/var/www/testserver/">
Options All Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Yukarıdaki şablon, standart apache-tomcat sunucu yapılandırma biçimini izler. Tek fark, modülden değişkenleri enjekte etmek için Ruby kaçış karakterinin kullanılmasıdır. Sistemin tam nitelikli alan adını depolayan FQDN'ye sahibiz. Bu,system fact.
Sistem bilgileri, her bir ilgili sistemin kukla kataloğunu oluşturmadan önce her sistemden toplanır. Puppet, bu bilgiyi almak için facter komutunu kullanır ve sistemle ilgili diğer ayrıntıları elde etmek için facter kullanılabilir. Vurgu satırlarını httpd.pp manifest dosyasına eklememiz gerekiyor.
class test-module::httpd {
package { 'httpd':
ensure => installed,
}
service { 'httpd':
ensure => running,
enable => true,
require => Package["httpd"],
}
file {'/etc/httpd/conf.d/testserver.conf':
notify => Service["httpd"],
ensure => file,
require => Package["httpd"],
content => template("test-module/testserver.conf.erb"),
}
file { "/var/www/myserver":
ensure => "directory",
}
}
Bu, aşağıdaki şeylerin başarılmasına yardımcı olur -
Bu, sunucu yapılandırma dosyası (/etc/httpd/conf.d/test-server.conf) için bir dosya kaynağı bildirimi ekler. Bu dosyanın içeriği, daha önce oluşturulmuş olan test-serverconf.erb şablonudur. Bu dosyayı eklemeden önce yüklenen httpd paketini de kontrol ediyoruz.
Bu, web sunucusu için bir dizin (/ var / www / test-server) oluşturan ikinci dosya kaynağı bildirimini ekler.
Ardından, yapılandırma dosyası ile https hizmeti arasındaki ilişkiyi notify => Service["httpd"]attribute. Bu, herhangi bir yapılandırma dosyası değişikliği olup olmadığını kontrol eder. Varsa Puppet hizmeti yeniden başlatır.
Sonraki adım, httpd_port'u ana bildirim dosyasına dahil etmektir. Bunun için ana init.pp manifest dosyasını sonlandırıp aşağıdaki içeriği eklememiz gerekiyor.
class test-module (
$http_port = 80
) {
include test-module::httpd
}
Bu, httpd bağlantı noktasını varsayılan değer olan 80'e ayarlar. Sonraki adım, Kukla uygulama komutunu çalıştırmaktır.
Aşağıdakiler çıktı olacaktır.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.84 seconds
Notice: /Stage[main]/test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensure:
current_value absent, should be file (noop)
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 4
events
Notice: Stage[main]: Would have triggered 'refresh' from 1 events
Notice: Finished catalog run in 0.51 seconds
Güvenlik Duvarını Yapılandırma
Sunucuyla iletişim kurmak için açık bir bağlantı noktası gerekir. Buradaki sorun, farklı türdeki işletim sistemlerinin güvenlik duvarını kontrol etmek için farklı yöntemler kullanmasıdır. Linux durumunda, 6'nın altındaki sürümler iptables, sürüm 7 ise firewalld kullanır.
Uygun bir hizmeti kullanma kararı, bir şekilde Puppet tarafından sistem gerçekleri ve mantığı kullanılarak ele alınır. Bunun için önce işletim sistemini kontrol etmemiz ve ardından uygun güvenlik duvarı komutunu çalıştırmamız gerekiyor.
Bunu başarmak için aşağıdaki kod parçasını testmodule :: http class içine eklememiz gerekir.
if $operatingsystemmajrelease <= 6 {
exec { 'iptables':
command => "iptables -I INPUT 1 -p tcp -m multiport --ports
${httpd_port} -m comment --comment 'Custom HTTP Web Host' -j ACCEPT &&
iptables-save > /etc/sysconfig/iptables",
path => "/sbin",
refreshonly => true,
subscribe => Package['httpd'],
}
service { 'iptables':
ensure => running,
enable => true,
hasrestart => true,
subscribe => Exec['iptables'],
}
} elsif $operatingsystemmajrelease == 7 {
exec { 'firewall-cmd':
command => "firewall-cmd --zone=public --addport = $ {
httpd_port}/tcp --permanent",
path => "/usr/bin/",
refreshonly => true,
subscribe => Package['httpd'],
}
service { 'firewalld':
ensure => running,
enable => true,
hasrestart => true,
subscribe => Exec['firewall-cmd'],
}
}
Yukarıdaki kod aşağıdakileri gerçekleştirir -
Kullanmak operatingsystemmajrelease kullanılan işletim sisteminin sürüm 6 mı yoksa 7 mi olduğunu belirler.
Sürüm 6 ise, Linux 6 sürümünü yapılandırmak için gerekli tüm yapılandırma komutlarını çalıştırır.
İşletim sistemi sürümü 7 ise, güvenlik duvarını yapılandırmak için gereken tüm gerekli komutları çalıştırır.
Her iki işletim sistemi için kod parçacığı, yapılandırmanın yalnızca http paketi yüklendikten sonra çalışmasını sağlayan bir mantık içerir.
Son olarak, Kukla uygulama komutunu çalıştırın.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for puppet.example.com in environment
production in 0.82 seconds
Notice: /Stage[main]/test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
SELinux'u yapılandırma
Sürüm 7 ve üzeri olan bir Linux makinesinde çalıştığımız için, onu http iletişimi yapacak şekilde yapılandırmamız gerekiyor. SELinux, varsayılan olarak HTTP sunucusuna standart olmayan erişimi kısıtlar. Özel bir bağlantı noktası tanımlarsak, SELinux'u bu bağlantı noktasına erişim sağlayacak şekilde yapılandırmamız gerekir.
Puppet, Booleanlar ve modüller gibi SELinux işlevlerini yönetmek için bazı kaynak türleri içerir. Burada port ayarlarını yönetmek için semanage komutunu yürütmemiz gerekiyor. Bu araçlar, varsayılan olarak red-hat sunucularında kurulu olmayan policycoreutils-python paketinin bir parçasıdır. Yukarıdakileri başarmak için aşağıdaki kodu test-module :: http sınıfının içine eklememiz gerekir.
exec { 'semanage-port':
command => "semanage port -a -t http_port_t -p tcp ${httpd_port}",
path => "/usr/sbin",
require => Package['policycoreutils-python'],
before => Service ['httpd'],
subscribe => Package['httpd'],
refreshonly => true,
}
package { 'policycoreutils-python':
ensure => installed,
}
Yukarıdaki kod aşağıdakileri gerçekleştirir -
Require => Package ['policycoreutils-python'] gerekli python modülünün kurulu olmasını sağlar.
Puppet, httpd_port'u doğrulanabilir olarak kullanarak bağlantı noktasını açmak için semanage kullanır.
Before => hizmeti, httpd hizmeti başlamadan önce bu komutun çalıştırılmasını sağlar. SELinux komutundan önce HTTPD başlarsa, servis talebini SELinux'a bırakır ve servis isteği başarısız olur.
Son olarak, Kukla uygulama komutunu çalıştırın
# puppet apply test-module/tests/init.pp --noop
...
Notice: /Stage[main]/test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
...
Notice: /Stage[main]/test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
...
Notice: /Stage[main]/test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Puppet önce python modülünü yükler ve ardından bağlantı noktası erişimini yapılandırır ve son olarak httpd hizmetini başlatır.
HTML Dosyalarını Web Ana Bilgisayarına Kopyalama
Yukarıdaki adımlarla http sunucusu yapılandırmasını tamamladık. Artık Puppet'in de yapılandırabileceği web tabanlı bir uygulamayı kurmaya hazır bir platformumuz var. Test etmek için, bazı örnek html indeksi web sayfalarını sunucuya kopyalayacağız.
Dosyalar dizininin içinde bir index.html dosyası oluşturun.
<html>
<head>
<title>Congratulations</title>
<head>
<body>
<h1>Congratulations</h1>
<p>Your puppet module has correctly applied your configuration.</p>
</body>
</html>
Manifest dizini içinde bir bildirim app.pp oluşturun ve aşağıdaki içeriği ekleyin.
class test-module::app {
file { "/var/www/test-server/index.html":
ensure => file,
mode => 755,
owner => root,
group => root,
source => "puppet:///modules/test-module/index.html",
require => Class["test-module::httpd"],
}
}
Bu yeni sınıf, tek bir kaynak yavaşlaması içerir. Bu, bir dosyayı modülün dosya dizininden web sunucusuna kopyalar ve izinlerini ayarlar. Gerekli öznitelik, test-module :: http sınıfının, biri test-module :: app'i uygulamadan önce yapılandırmayı başarıyla tamamlamasını sağlar.
Son olarak, main init.pp bildirimimize yeni bir bildiri eklememiz gerekiyor.
class test-module (
$http_port = 80
) {
include test-module::httpd
include test-module::app
}
Şimdi, neler olduğunu gerçekten test etmek için apply komutunu çalıştırın. Aşağıdakiler çıktı olacaktır.
# puppet apply test-module/tests/init.pp --noop
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera
defaults
Notice: Compiled catalog for brcelprod001.brcle.com in environment
production in 0.66 seconds
Notice: /Stage[main]/Test-module::Httpd/Exec[iptables]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[policycoreutilspython]/
ensure: current_value absent, should be present (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[iptables]: Would have
triggered 'refresh' from 1 events
Notice: /Stage[main]/Test-module::Httpd/File[/var/www/myserver]/ensure:
current_value absent, should be directory (noop)
Notice: /Stage[main]/Test-module::Httpd/Package[httpd]/ensure:
current_value absent, should be present (noop)
Notice:
/Stage[main]/Test-module::Httpd/File[/etc/httpd/conf.d/myserver.conf]/ensur
e: current_value absent, should be file (noop)
Notice: /Stage[main]/Test-module::Httpd/Exec[semanage-port]/returns:
current_value notrun, should be 0 (noop)
Notice: /Stage[main]/Test-module::Httpd/Service[httpd]/ensure:
current_value stopped, should be running (noop)
Notice: Class[test-module::Httpd]: Would have triggered 'refresh' from 8
Notice:
/Stage[main]/test-module::App/File[/var/www/myserver/index.html]/ensur:
current_value absent, should be file (noop)
Notice: Class[test-module::App]: Would have triggered 'refresh' from 1
Notice: Stage[main]: Would have triggered 'refresh' from 2 events Notice:
Finished catalog run in 0.74 seconds
Vurgulanan satır, index.html dosyasının web barındırıcısına kopyalanmasının sonucunu gösterir.
Modülün Sonlandırılması
Yukarıdaki tüm adımlar ile oluşturduğumuz yeni modülümüz kullanıma hazırdır. Modülün bir arşivini oluşturmak istersek, aşağıdaki komut kullanılarak yapılabilir.
# puppet module build test-module