Puppet (puppetizace)
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.
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ářimanifest
v rámci kontextu odpovídajícího prostředí. Kupř. uvedená cesta by se vzdahovala k prostředí s názvemjine
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.
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.
root@stroj:/# cat /etc/hostname
stroj-v-chroot
root@stroj:/# hostname
stroj
root@stroj:/# hostname $(cat /etc/hostname)
root@stroj:/# hostname
stroj-v-chroot
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:
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.
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.
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í...
master (KVM) :/etc/puppet# rm ssl/ca/requests/*pem
|
To však není zrovna korektní. Správné řešení je toto...
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:
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:
Není-li v tomto okamžiku ještě nod nakonfigurován v manifestu, skončí vzájemná komunikace chybou.
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
.
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.
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
U zavrženého certifikátu se pak bude při výpisu místo znaménka plus zobrazovat mínus.
Pro to, aby master přestal se zavrženým strojem komunikovat, se musí démon restartovat. |
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ě.
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:
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ů.
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.
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:
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.
root@stroj~# /etc/init.d/puppet start
[ ok ] Starting puppet agent.
|
Změna intervalu
/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:
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á:
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:
root@stroj~# puppet agent --disable
|
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.
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ě:
root@stroj~# echo '{"disabled_message":"Nechci aby puppet do něčeho hrabal"}' > /var/lib/puppet/state/agent_disabled.lock
|
Což má stejný efekt jako:
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
:
root@stroj~# puppet agent --environment jmeno_prostredi
|
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. |
- ↑ 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.