Puppet – instalacja i konfiguracja (część 1)

Puppet – instalacja i konfiguracja część 1Puppet to popularne oprogramowanie, które ułatwia zarządzanie serwerami oraz automatyzuje ich konfigurację. Możliwości jest sporo, od tworzenia, modyfikacji plików, zmiany ich praw, poprzez instalację wymaganego oprogramowania oraz monitorowania wybranych procesów, a w razie problemów ich automatycznego uruchomienia. Te wszystkie rzeczy możemy wygodnie zdefiniować na centralnym serwerze, a nowe maszyny po połączeniu się z nim, natychmiast zaimplementują niezbędne poprawki. Taki proces zdecydowanie przyspiesza provisioning nowych serwerów i oszczędza wiele czasu dla administratora, który nie musi za każdym razem wprowadzać tych samych poleceń. Puppet jest darmowym oprogramowaniem napisanym w języku Ruby, rozwijanym na licencji GNU GPL. Jest on dostępny praktycznie dla wszystkich popularnych systemów operacyjnych.

W poniższym wpisie zaczniemy jak zwykle od początku, czyli od instalacji i wstępnej konfiguracji oprogramowania. Do tego wykorzystamy dwie maszyny wirtualne z zainstalowanym systemem CentOS 6.5. Jedna z nich będzie pełnić rolę serwera, druga to naturalnie klient.

Nazwa hosta (fqdn) Adres IP Rola
puppet-master.local.net 192.168.34.20 Serwer
puppet-slave01.local.net 192.168.34.21 Klient

Puppet instalacja

Skorzystamy z oficjalnego repozytorium puppet’a, przez co będziemy mieli dostęp do aktualnych wersji oprogramowania:

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

Na serwerze puppet-master instalujemy pakiet puppet-server

yum install puppet-server

yum doinstalował automatycznie parę dodatkowych pakietów (facter, hiera i kilka ruby). Na drugiej maszynie instalujemy pakiet puppet:

yum install puppet

Puppet nasłuchuje domyślnie na porcie 8140, musimy się upewnić, że ten port jest otwarty dla naszej testowej sieci (192.168.34.0/24). Dodajemy odpowiednią regułę do pliku /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8140 -s 192.168.34.0/24 -j ACCEPT

i uruchamiamy ponownie firewall’a

/etc/init.d/iptables restart

Kolejną sprawą jest to, że klient musi wiedzieć gdzie znajduje się puppet serwer. Domyślnie szuka on maszyny o nazwie puppet, dlatego taka nazwa hosta musi zwrócić właściwy adres IP. Dodamy więc ten wpis do pliku /etc/hosts

[root@puppet-slave01 ~]# cat /etc/hosts | grep puppet
192.168.34.20   puppet-master.local.net puppet.local.net puppet
192.168.34.21   puppet-slave01.local.net

Jeżeli chcemy użyć innego hosta/domeny, wystarczy odpowiednio skonfigurować zmienną PUPPET_SERVER w plikiu /etc/sysconfig/puppet, przykładowo

# The puppetmaster server
PUPPET_SERVER=puppet-master.local.net
# Where to log to. Specify syslog to send log messages to the system log.
PUPPET_LOG=/var/log/puppet/puppet.log

Chcemy też, aby proces puppetmaster automatycznie startował wraz z systemem:

[root@puppet-master ~]# chkconfig puppetmaster on
[root@puppet-master ~]# chkconfig --list puppetmaster
puppetmaster    0:off   1:off   2:on    3:on    4:on    5:on    6:off

oraz analogicznie start agenta na maszynie puppet-slave01

[root@puppet-slave01 ~]# chkconfig puppet on
[root@puppet-slave01 ~]# chkconfig --list puppet
puppet          0:off   1:off   2:on    3:on    4:on    5:on    6:off

Uruchomienie

Wstępne przygotowania gotowe możemy więc wystartować proces puppetmaster:

[root@puppet-master ~]# /etc/init.d/puppetmaster start

Następnie uruchamiamy agenta na drugim serwerze:

[root@puppet-slave01 ~]# /etc/init.d/puppet start

Po wystartowaniu usług za pierwszym razem, każda z maszyn wygeneruje swoje certyfikaty. Dla zainteresowanych znajdziemy je w katalogu /var/lib/puppet/ssl. Następnie puppet-slave01 próbuje połączyć się z głównym serwerem, musimy jednak zweryfikować jego certyfikat, w przeciwnym wypadku komunikacja nie będzie możliwa:

[root@puppet-master ~]# puppet cert --list
          "puppet-slave01.local.net" (SHA256) DA:94:FB:C3:1B:A2:93:86:10:0D:23:C9:29:BF:57:C4:E7:42:32:4B:CB:18:12:8B:57:48:65:93:1D:00:47:C1

 

[root@puppet-slave01 puppet]# puppet agent --test
        Exiting; no certificate found and waitforcert is disabled

Nie pozostaje nic innego jak podpisać certyfikat

[root@puppet-master ~]# puppet cert sign puppet-slave01.local.net
        Notice: Signed certificate request for puppet-slave01.local.net
        Notice: Removing file Puppet::SSL::CertificateRequest puppet-slave01.local.net at '/var/lib/puppet/ssl/ca/requests/puppet-slave01.local.net.pem'

Przetesujemy jeszcze raz komunikację:

[root@puppet-slave01 puppet]# puppet agent --test
        Info: Retrieving pluginfacts
        Info: Retrieving plugin
        Info: Caching catalog for puppet-slave01.local.net
        Info: Applying configuration version '1413973700'
        Notice: Finished catalog run in 0.48 seconds

Wszystko działa jak należy.

Puppet konfiguracja – przykład /etc/motd

Zaczniemy od prostego przykładu, chcemy aby po połączeniu hosta z serwerem puppet tworzył się plik /etc/motd, w którym zawarte będą takie informacje jak hostname i adres IP. Punkt wejściowy dla puppeta to plik /etc/puppet/manifests/site.pp, wpisujemy do niego tylko jedną linijkę:

import 'nodes.pp'

W pliku nodes.pp zdefiniujemy konkretne maszyny oraz moduł motd którego puppet-slave01 ma użyć:

cat nodes.pp

node default {
}
node 'puppet-slave01.local.net' {
    include motd
}

Przechodzimy do sedna, utworzymy moduł motd, w tym celu tworzymy poniższą strukturę w katalogu /etc/puppet/modules

[root@puppet-master ~]# cd /etc/puppet/modules/
[root@puppet-master modules]# tree
.
└── motd
    └── manifests
        └── init.pp

Jest to minimalistyczna wersja, którą za chwilę trochę rozwiniemy. Skupiamy się teraz na pliku init.pp, w którym znajduje się już właściwa konfiguracja:

[root@puppet-master ~]#  cat /etc/puppet/modules/motd/manifests/init.pp
class motd {
    file { "/etc/motd":
        ensure => present,
        owner => root,
        group => root,
        mode => 444,
    }
}

Powyżej zdefiniowalismy klasę motd, w której:

  • upewniamy się że plik /etc/motd istnieje
  • że jego właścicielem/grupą jest użytkownik root
  • ustawiamy prawa tylko do odczytu dla właściciela, grupy i innych

Czas na przetestowanie konfiguracji, zaczniemy od usunięcia pliku motd na puppet-slave01, a następnie uruchomimy ręcznie agenta puppet:

[root@puppet-slave01 ~]# rm -f /etc/motd
[root@puppet-slave01 ~]# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-slave01.local.net
Info: Applying configuration version '1414138811'
Notice: /Stage[main]/Motd/File[/etc/motd]/ensure: created
Notice: Finished catalog run in 0.06 seconds
[root@puppet-slave01 ~]# ll /etc/motd
-r--r--r-- 1 root root 0 24. Okt 10:29 /etc/motd

Plik został utworzony dokładnie tak, jak zdefiniowaliśmy go w naszym module. Zobaczmy co się stanie jeśli zmienimy tylko prawa pliku:

[root@puppet-slave01 ~]# chmod 777 /etc/motd
[root@puppet-slave01 ~]# chown nobody.nobody /etc/motd
[root@puppet-slave01 ~]# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-slave01.local.net
Info: Applying configuration version '1414139396'
Notice: /Stage[main]/Motd/File[/etc/motd]/owner: owner changed 'nobody' to 'root'
Notice: /Stage[main]/Motd/File[/etc/motd]/group: group changed 'nobody' to 'root'
Notice: /Stage[main]/Motd/File[/etc/motd]/mode: mode changed '0777' to '0444'
Notice: Finished catalog run in 0.10 seconds
[root@puppet-slave01 ~]# ll /etc/motd
-r--r--r-- 1 root root 0 24. Okt 10:29 /etc/motd

Jak widać puppet przywrócił właściwe prawa. Aktualnie nasz plik jest zupełnie pusty, chcielibyśmy aby w środku zapisany był adres IP oraz hostname. Do init.pp dodajemy opcję content, w której wskazujemy gdzie znajduje się template do message of the day

class motd {
    file { "/etc/motd":
        ensure => present,
        owner => root,
        group => root,
        mode => 444,
        content => template("motd/motd.erb"),
    }
}

Tworzymy katalog templates a w nim motd.erb

[root@puppet-master motd]# tree
.
├── manifests
│   └── init.pp
└── templates
    └── motd.erb

Plik motd.erb jest template’em ruby, możemy w nim użyć różnych predefiniowanych zmiennych (w naszym przypadku nazwa hosta, adres IP, ilość pamięci oraz ilość wolnej pamięci). Poszerza to znacznie nasze możliwości, co jest niezbędne w środowisku w którym puppet obsłużyć ma więcej klientów:

Serwer: <%= hostname %>, adres IP: <%= ipaddress %>.
Ilość pamięci: <%= memorysize %>, wolnej: <%= memoryfree %>

Inne zmienne, które możemy użyć wyświetlamy korzystając na przykład z polecenia facter

[root@puppet-slave01 ~]# facter | grep memory
memoryfree => 182.88 MB
memoryfree_mb => 182.88
memorysize => 238.45 MB
memorysize_mb => 238.45
[root@puppet-slave01 ~]# facter | wc -l
90

Pozostaje nam przetestować nowe zmiany:

[root@puppet-slave01 ~]# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-slave01.local.net
Info: Applying configuration version '1414140183'
Notice: /Stage[main]/Motd/File[/etc/motd]/content:
--- /etc/motd   2014-10-24 10:42:13.202785916 +0200
+++ /tmp/puppet-file20141024-18775-1mpkcb1-0    2014-10-24 10:42:54.174801150 +0200
@@ -0,0 +1,3 @@
+Serwer: puppet-slave01, adres IP: 192.168.34.21.
+Ilość pamięci: 238.45 MB, wolnej: 148.42 MB
+

Info: Computing checksum on file /etc/motd
Info: FileBucket got a duplicate file {md5}d41d8cd98f00b204e9800998ecf8427e
Info: /Stage[main]/Motd/File[/etc/motd]: Filebucketed /etc/motd to puppet with sum d41d8cd98f00b204e9800998ecf8427e
Notice: /Stage[main]/Motd/File[/etc/motd]/content: content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}c21cdefe47902c2df4800d839d3799eb'
Notice: Finished catalog run in 0.12 seconds

 

Serwer: puppet-slave01, adres IP: 192.168.34.21.
Ilość pamięci: 238.45 MB, wolnej: 148.42 MB

Puppet wygenerował plik /etc/motd zgodnie z naszym template’em.

W następnym wpisie rozwiniemy dalej nasze środowisku testowe, nauczymy się instalować pakiety oraz uruchamiać usługi przez puppeta. Jak zwykle czekamy na Wasze komentarze.

  1. Muszę przyznać, że ciekawy wstęp. Też się zabierałem za puppeta od miesięcy, wkoncu coś więcej z niego rozumiem. Program ma sporo możliwości, może kiedyś go opanuje. Czekam na kolejne tutoriale.

    • Możliwości są ogromne, puppet to już prawdziwa „kobyła”. Kolejne tutoriale już na blogu.

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*