Puppet (puppetizace)

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání
Puppetizace je proces, kdy je na stroj se základní instalací aplikován manifest.


U Puppetu platí, že co není specifikováno v manifestem, na to agent nehrabe, ovšem bez specifikace nodu by agent skončil chybou, takže proces puppetizace stroje začíná vždy tím, že se na stroji, který slouží jako master, vytvoří definice nodu.

Poznámka
node 'puppet' {
}

Tento záznam je umístěn ve výchozím souboru manifestu, který se může ocitnout na několika místech:

/etc/puppet/manifests/site.pp
V jednom souboru site.pp pokud se nepoužívají jiná prostředí a naopak se používá pouze jeden výchozí manifest pro všechny nody.
/etc/puppet/manifests/site.pp/libovolny.pp
V některém z dílčích manifestů v adresáři site.pp pokud se nepoužívají jiná prostředí, ale pro každou skupinu nodů se používá samostatný výchozí manifest.
/etc/puppet/manifests/environment/production/manifest/site.pp
V souboru site.pp v adresáři /etc/puppet/manifests/environment/production/manifest pokud se používají i jiná prostředí.
/etc/puppet/manifests/environment/jine/manifest/site.pp
Nebo v souboru site.pp v adresáři manifest v rámci kontextu odpovídajícího prostředí. Kupř. uvedená cesta by se vzdahovala k prostředí s názvem jine

Teprve po vytvoření záznamu bychom měli pokračovat vygenerováním SSL certifikátu a jeho podepsáním.

Před vystavením a podepsáním žádosti o certifikát by agent neměl běžet jako démon. Mohlo by se totiž stát, že by se po podepsání certifikátu agent "chytnul" na manifest náležející jinému stroji a na jeho základě provedl nežádoucí změny. U novější verze klienta je tento problém ošetřen tak, že se musí spuštění agenta před prvním použitím - i za předpokladu že je spouštěn s parametrem --noop, povolit.

Poznámka
root@stroj:/etc# puppet agent --enable

Při puppetizaci stroje, který nemusí mít platný doménový záznam, je pro identifikaci certifikátu rozhodující aktuální hostname. Pokud dojde k jeho změně, musí se proces vydání a podepsání certifikátu zopakovat.

Občas se vyskytne situace, kdy potřebujeme, aby příkaz hostname v chrootovaném prostředí vracel jméno, které je nastaveno v něm. Ač je řešení triviální, není obecně známé
root@stroj:/# cat /etc/hostname
stroj-v-chroot
root@stroj:/# hostname
stroj
root@stroj:/# hostname $(cat /etc/hostname)
root@stroj:/# hostname
stroj-v-chroot
Na tento problém narazíte především v situaci, kdy budete chtít přes puppet udržovat systém, který sám o sobě nikdy neběží - typicky systém disklessové stanice, který je za normální situace překrytý readonly diskem. Tzn. že veškeré změny a úpravy se při restartu zahodí.


V případě puppetizace stroje, který má sám sobě být master si můžeme před vydáním certifikátu pomoci záznamem v souboru /etc/hosts, kterým bude přiřazeno hostname stroje na localhostovou adresu:

Poznámka
127.0.0.1    localhost puppet

Certifikát

Ověřený SSL certifikát Puppet používá k šifrování síťové komunikace serverem, který poskytuje manifesty a klientem, který vygenerovaný manifest zpracovává.

Žádost klienta o certifikát

Vystavení žádosti o podepsání certifikátu provedeme jednoduše tím, že spustíme na příkazové řádce agenta.

Poznámka
root@stroj:/etc# puppet agent --noop --test --verbose --server master.felk.cvut.cz

Pokud si necháváme vystavit certifikát z jiného stroje, než kde běží master a v DNS, ani v /etc/hosts, ani v hlavním konfiguračním souboru /etc/puppet/puppet.conf v proměnné $server pro něj není záznam, můžeme uvést IP adresu serveru jako hodnotu atributu přímo na příkazové řádce. Stejným způsobem můžeme "předhodit" prostřednictvím parametru atributu --fqdn jméno, pod kterým se má agent hlásit při generování manifestu.

Poznámka
root@stroj:/etc# puppet agent --noop --test --verbose --server master.felk.cvut.cz --fqdn puppet.example.net

Vystavenný SSL certifikát se pak musí na stroji master podepsat. Pak se jím bude šifrovat vzájemná komunikace.

Odstranění nepodepsaných žádostí o certifikát na straně serveru

Pokud chceme odstranit žádosti o certifikát, které dosud nebyly podepsány, máme několik možností. Jednak je můžeme rovnou smazat z úložiště čekajících žádostí...

Poznámka
 master (KVM) :/etc/puppet# rm ssl/ca/requests/*pem

To však není zrovna korektní. Správné řešení je toto...

Poznámka
 master (KVM) :/etc/puppet# puppet ca destroy stroj.domena.jakasi

Podepsání certifikátu na straně serveru

Výpis seznamu žádostí, čekajících na podepsání na stroji master:

Poznámka
 master (KVM) :~# puppet cert list
   "stroj.felk.cvut.cz" (93:44:BC:C1:9F:1D:7E:6D:83:BD:24:E7:9A:0A:B3:82)

Podepsání čekající žádosti na stroji master:

Poznámka
  
 master (KVM) :~# puppet cert sign stroj.felk.cvut.cz
 notice: Signed certificate request for stroj.felk.cvut.cz
 notice: Removing file Puppet::SSL::CertificateRequest stroj.felk.cvut.cz at '/etc/puppet/ssl/ca/requests/stroj.felk.cvut.cz.pem'

Není-li v tomto okamžiku ještě nod nakonfigurován v manifestu, skončí vzájemná komunikace chybou.

Poznámka Pokud se v síti může objevit více nodů se stejným hostname, které se liší pouze doménou, je třeba k tomu aby se manifest neaplikoval na všechny, uvést jméno nodu plným doménovým jménem.

Ověření zda agent komunikuje se strojem master

Je-li u stroje, na kterém běží server pro Puppet v souboru /etc/hosts uveden alias puppet, nebo je-li tento server nastaven v konfiguraci agenta, pak na příkazové řádce nemusí být uváděn parametr --server.

Poznámka
 root@stroj:/etc# puppet agent --noop --test --verbose --server master.felk.cvut.cz
 info: Caching catalog for stroj.felk.cvut.cz
 info: Applying configuration version '1353687981'

Pokud proběhlo podepsání certifikátu v pořádku, tak proběhne komunikace bez chybových zpráv.

Upozornění Ve výchozí konfiguraci je automatické spouštění agenta v souboru /etc/default/puppet zakázáno (v proměnné START). Povolte ho, až když budete mít připravený použitelný manifest.

Zavržení (revokace) certifikátu

Se aplikuje tehdy, pokud chceme zcela zamezit agentu ze stroje pro který byl certifikát původně vydán přístup ke stroji master.

Při revokaci totiž zůstává informace o původním certifikátu zachována a master případnou novou žádost ze stroje se stejným jménem na jejím základě odmítne přijmout.

Při revokaci nestačí uvést pouze jméno nodu, jak ho vrací operace list, ale musí být uvedeno i pořadové číslo certifikátu který chceme odvolat. To však lze zjistit pouze přes operaci print

Poznámka
 master (KVM) :~# puppet cert list stroj.felk.cvut.cz
 + "stroj.felk.cvut.cz" (3A:66:50:B1:3D:C2:56:CB:8B:6E:AA:2F:BB:A1:C3:A2)
 master (KVM) :~# puppet cert print stroj.felk.cvut.cz | grep 'Serial Number'
         Serial Number: 7 (0x7)
 master (KVM) :~# puppet cert revoke stroj.felk.cvut.cz 0x7
 notice: Revoked certificate with serial 7
 ...
 master (KVM) :~# puppet cert list stroj.felk.cvut.cz
 - "stroj.felk.cvut.cz" (3A:66:50:B1:3D:C2:56:CB:8B:6E:AA:2F:BB:A1:C3:A2) (certificate revoked)

U zavrženého certifikátu se pak bude při výpisu místo znaménka plus zobrazovat mínus.

Upozornění Pro to, aby master přestal se zavrženým strojem komunikovat, se musí démon restartovat.
Poznámka Pokud by se vám omylem povedlo revokovat (tak jako mě) všechny certifikáty, tak pokud máte udržován přes git také adresář s Puppetími SSL certifikáty, tak si vytáhněte původní obsah souboru /etc/puppet/ssl/ca/ca_crl.pem a nahraďte stávající obsah tím původním.

Odstranění certifikátu

Odstranění certifikátu je operace, která používá pro..

  • Odstranění čekajících a dosud nepodepsaných žádostí strojů, které nechceme spravovat přes Puppet.
  • Zneplatnění a zrušení již podepsaných certifikátů strojů, které prošly reinstalací, nebo byly zrušeny. Podepsaný certifikát se nejprve zneplatní a následně se neplatný klíč odstraní z úložiště.
Poznámka
 master (KVM) :~# puppet cert clean stroj.felk.cvut.cz
 notice: Revoked certificate with serial 6
 notice: Removing file Puppet::SSL::Certificate linus.felk.cvut.cz at '/etc/puppet/ssl/ca/signed/stroj.felk.cvut.cz.pem'
 notice: Removing file Puppet::SSL::Certificate linus.felk.cvut.cz at '/etc/puppet/ssl/certs/stroj.felk.cvut.cz.pem

Vydání nového certifikátu

Pokud chceme z nějakého důvodu vydat certifikát nový - kupř. když u stávajícímu certifikátu vypršela platnost, nebo došlo k diskreditaci klienta, musí se nejprve na stroji master odstranit původní podepsaný certifikát a pak, na klientském stroji kde běží agent odstranit z úložiště SSL certifikátů původní podepsaná žádost o certifikát, která se nalézá v adresáři ./puppet/ssl/certificate_requests i vydaný klíč (v adresáři ./puppet/ssl/certs )

Teprve poté je možné vygenerovat novou žádost o certifikát, kterou bude možné na stroji master podepsat.

Než spustíme démona...

Je vhodné nejprve vyzkoušet zpracování manifestu "nasucho", spuštěním v testovacím módu[1] s atributem --noop, který zabrání tomu aby došlo k jeho realizaci:

Poznámka
root@client~# puppet agent --noop --test --verbose
...

Z výpisu tak budeme moci zjistit jaké změny se budou realizovat a především odhalit ještě před spuštěním démona chyby, na kterých by selhalo zpracování manifestu. A ty ošetřit buď na straně manifestu (na stroji master), nebo v systému klienta, tak aby zpracování manifestu démonem proběhlo bez problémů.

Upozornění Pokud spravujeme přes agenta také stroj co na něm běží master ale klientský certifikát chceme mít uložen v jinde, než jsou certifikáty s nimiž pracuje master, je třeba vygenerované soubory zkopírovat do lokace SSL certifikátů agenta (u Debianu adresář /var/lib/puppet/ssl

Puppet agent

Ve výchozím stavu je automatické spouštění agenta vypnuto. Nejjednodušší způsob, jak zjistit zda-li Puppet v režimu agent běží, je zkontrolovat spuštěné procesy.

Poznámka
root@stroj~# ps -ef | grep agent
root      3448     1  1 12:36 ?        00:00:00 /usr/bin/ruby /usr/bin/puppet agent

Pokud agent mezi spuštěnými procesy není, tak to může znamenat, že je jeho automatické spouštění vypnuto. Pro jistotu si ověřte jeho status:

Poznámka
root@stroj~# /etc/init.d/puppet status
[FAIL] agent is not running ... failed!

V tomto případě je agent zastavený. Neznamená to, že by ho nebylo možné používat, ale to, že se po restartu automaticky nenahodí. Manuálně jej spustit lze.

Poznámka
root@stroj~# /etc/init.d/puppet start
[ ok ] Starting puppet agent.

Změna intervalu

Je-li agent spuštěn jako démon, pak v pravidelném půhodinovém intervalu (1800 sekund) stahuje ze stroje master aktuální verzi manifestu. Pokud tato verze obsahuje oproti předchozí nějakou změnu, tak se ji po půlhodinové prodlevě pokusí realizovat. Výsledek zpracování se zapisuje do souboru /var/log/daemon.log


Výchozí půlhodinový interval pro běžnou správu bohatě stačí, pokud však ladíme nastavení manifestu a potřebujeme aby agent kontroloval master v kratším intervalu, pak jej lze zkrátit nastavením číselné hodnoty proměnné runinterval v sekci [main] konfiguračního soubor /etc/puppet/puppet.conf. Ta má ve výchozím stavu hodnotu 1800 (sekund).

Je-li hodnota 0, tak bude agent kontaktovat master ihned jakmile skončí ověření staženého manifestu, které se pohybuje v řádech sekund.

Prodleva

Automatické spouštění agenta

U starších verzí Puppetu bylo pro automatické spouštění agenta nutné nejprve provést jeho aktivaci. Ta se dělala takto:

Poznámka
root@stroj~# puppet agent enable
root@stroj~# /etc/init.d/puppet status
[FAIL] agent is not running ... failed!
root@stroj~# /etc/init.d/puppet start
[ ok ] Starting puppet agent.
root@stroj~# /etc/init.d/puppet status
[ ok ] agent is running.

U novějších verzí se puppet spouští automaticky, ale nic nedělá, dokud nedojde k jeho aktivaci! Aktivace se provádí podobně jako u starších verzí, ovšem s drobným rozdílem - že se 'enable' nepředává jako akce, ale jako parametr (--enable). Předtím si však můžete pomocí parametru -t ověřit, v jakém stavu se váš agent aktuálně nalézá:

Poznámka
root@stroj~# puppet agent -t
Notice: Skipping run of Puppet configuration client; administratively disabled (Reason: 'reason not specified');
Use 'puppet agent --enable' to re-enable.
root@stroj~# puppet agent --enable

Aktivací dojde ke zrušení souboru /var/lib/puppet/state/agent_disabled.lock a agent začne komunikovat s puppet serverem ve vaší síti.

Deaktivace agenta

Jsou ovšem situace, kdy potřebujeme agenta deaktivovat. Provádí se podobně jako aktivace, spuštění agenta s parametrem --disable:

Poznámka
root@stroj~# puppet agent --disable
Upozornění Pozor! Je důležité vědět, že deaktivací nedojde k zastavení spuštěného agenta, ale pouze k pozastavení jeho komunikace se strojem master! Pokud má agent již stažený katalog, tak ho bude i nadále při každém průchodu zpracovávat!

Pozastavení zpracování staženého katalogu

Soubor /var/lib/puppet/state/agent_disabled.lock, který se vytvoří při deaktivaci tomu nezabrání. Je-li agent spuštěný, je třeba vytvořit také zámek, který zabrání zpracování katalogu.

Poznámka
root@stroj~# touch /var/lib/puppet/state/agent_catalog_run.lock

To je soubor, který si jinak agent vytváří sám, automaticky během stahování katalogu, jako pojistku, aby nezačal zpracovávat neúplný katalog. Po reaktivaci agenta a stažení aktualizované verze katalogu tento soubor zmizí.}}

Důvod deaktivace agenta

Při deaktivaci můžeme uvést také důvod. Ten se pak bude zobrazovat při testu viz výše místo 'reason not specified'. Zámek ale můžeme vytvořit také manuálně:

Poznámka
root@stroj~# echo '{"disabled_message":"Nechci aby puppet do něčeho hrabal"}' > /var/lib/puppet/state/agent_disabled.lock

Což má stejný efekt jako:

Poznámka
root@stroj~# puppet agent --disable "Nechci aby puppet do něčeho hrabal"

Jak zamezit automatickému spouštění agenta

Automatickému spouštění agenta lze zabránit pouze tím, že se v souboru /etc/puppet/puppet.conf do sekce [agent] nastaví parametr daemonize na hodnotu false:

...
[agent]
daemonize=false
...

Puppet agent se tím nevypne, jen se zabrání tomu, aby automaticky stahoval ze serveru aktualizovaný katalog a prováděl změny na pozadí. Při manuálním spouštění normálně funguje. Takové chování je žádoucí především při odlaďování manifestu, kdy potřebujeme vidět, co se agent chystá udělat, resp. co dělá.

Spouštění agenta s konfigurací jiného prostředí

Při manuálním spouštění agenta na příkazové řádce lze jméno jiného prostředí předávat jako hodnotu parametru --environment :

Poznámka
root@stroj~# puppet agent --environment jmeno_prostredi
Poznámka Při použití testovacího prostředí Puppet využívá již existujícího SSL certifikátu, tudíž není nutné proces s vydáním certifikátu opakovat.
  1. V testovacím módu se agent nespouští jako démon, nýbrž zpracuje manifest pouze jednou a na popředí - podobně, jako by byly uvedeny atributy --no-daemonize a --onetime.