Puppet (instalace)

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Většina linuxových distribucí má obě části Puppetu - klienta i server ve svých repozitářích a umožňuje tak provést instalaci přes standardní balíčkovací systém.

Výchozí konfigurace - tj. nastavení cest k adresářům, atp. - však nemusí být všude stejná a může se mírně lišit. Následující postupy a příklady byly realizovány v rámci distribuce Debian wheezy amd64, s aktuální verzí Puppetu 2.7.18.

Poznámka Pro archivaci veškerých změn při úpravách manifestů na serveru je vhodné používat nějaký verzovací systém. Obecně je doporučován git. Pokud je na stroji nainstalován etckeeper, tak v podstatě není třeba nic víc řešit, pouze je třeba po každé úpravě provést uložení aktuálních změn, včetně komentáře a v případě certifikátů přidat odpovídající nově vzniklé soubory do repozitáře.

Konfigurace

Na serveru, i na spravovaných nodech se instaluje jeden a ten samý skript napsaný v Ruby. To, zda běží jako démon, chová se jako agent či master, nebo dělá jinou činnost, je určeno prvním předaným argumentem.

Dalšími argumenty lze případně korigovat a měnit výchozí proměnné a chování akceptované při příslušné činnosti. Tyto argumenty lze předávat:

  • při spouštění démona (prostřednictvím konfiguračních souborů v /etc/default)
  • při akcích na příkazové řádce
  • nebo jako hodnoty proměnných v hlavním konfiguračním souboru puppet.conf

Jinak, jsou vždy aplikovány výchozí hodnoty.

Poznámka Instalace Puppetu na serveru se od instalace na klientském nodu liší především v tom, že obsahuje navíc soubory, které by byly na klienstkém nodu zbytečné.


Na serveru i na klienském nodu je hlavní konfigurační soubor puppet.conf, který spuštěný démon průběžně kontroluje a případné změny ihned aplikuje.

Pokud Puppet neběží pod rootem (na unixových systémech), nebo se zvýšenými právy (na Windows), hledá démon tento soubor v podadresáři .puppet, v rámci domovského adresáře uživatele pod kterým je spuštěn. Linuxové distribuce jej však mají obvykle umístěn v adresář /etc/puppet.

Umístění konfigurace však lze přenastavit při spuštění agenta skrze proměnnou $confdir. Pokud nevíte odkud spuštěný démon bere svou konfiguraci můžete použít následující příkaz

user@stroj~$ sudo puppet agent --configprint confdir
Poznámka Stejným způsobem lze zjišťovat i aktuální nastavení jiných proměnných. Je-li místo názvu proměnné uvedeno klíčové slovo all, je na konzoli vypsáno komplet vše, včetně výchozích hodnot proměnných, které v konfiguračních souborech uvedeny nejsou.
Windows 2003
$confdir obsahuje %ALLUSERSPROFILE%\PuppetLabs\puppet\etc, což je expandováno na C:\Documents and Settings\All Users\Application Data\PuppetLabs\puppet\etc
Windows 7, Windows 2008
$confdir obsahuje %PROGRAMDATA%\PuppetLabs\puppet\etc, což je expandováno na C:\ProgramData\PuppetLabs\puppet\etc
Upozornění Na Windows soubor puppet.conf používá konce řádek CRLF, kdežto na unixu pouze LF!


auth.conf

fileserver.conf

Ve výchozím nastavení Puppet automaticky hledá soubory v adresáři files u modulů. To však za určitých okolností nemusí být praktické - kupř. pokud spravujeme moduly Puppetu přes git a nechceme aby součástí jejich repozitářů byly SSH klíče aj. "citlivé" soubory.

V takovém případě lze prostřednictvím tohoto konfiguračního souboru fileserver.conf nakonfigurovat i jiná úložiště..

# Soubory jsou uložené v adresáři /cesta/k/souborum, který se má jevit jako úložiště puppet:///extra_files/
 [extra_files]
     path /cesta/k/souborum
     allow *.felk.cvut.cz
     allow 192.168.33.0/24

Pomocí direktiv allow a deny lze povolit, či naopak zakázat přístup k těmto souborům na základě domény či IP adresy stroje kde běží agent. Pokud mají mít přístup povolen všechny stroje, pak stačí uvést pouze znak * (hvězdička).

Poznámka Cesta ke konfiguračnímu souboru fileserver.config je uložená v proměnné fileserverconfig Pokud bychom chtěli mít soubor s konfigurací úložišť uložen někde jinde, je třeba nastavit k němu cestu v souboru puppet.conf a tím změnit výchozí hodnotu.

puppet.conf

Soubor používá stejnou syntaxi jako INI soubory. Konfigurace je rozdělena do bloků, které definují hlavičky v hranatých závorkách a proměnné se nastavují přiřazením hodnoty. Může-li proměnná obsahovat více hodnot, jsou odděleny čárkou. Ignorovány jsou řádky které mají jako první alafanumerický znak mřížku (#).

Poznámka Tam, kde konfigurace vyžaduje nastavení určitého vlastníka, skupiny či práv, lze uvést tato nastavení za příslušnou hodnotu proměnné do složených závorek.

Od verze 2.7 má Puppet konfiguraci rozdělenou do bloků podle módů v jakých může pracovat

main
Obsahuje obecně platná nastavení
agent
Obsahuje nastavení pro mód, kdy zpracovává stažený manifest
master
Obsahuje nastavení pro mód kdy běží jako server
user
Obsahuje obsahuje nastavení specifická pro uživatele
Upozornění Do verze 3.6 bral master všechny ostatní bloky jako konfigurační nastavení nového prostředí (environment). Pokud tedy bylo tímto způsobem nastavené jiné prostředí než produkční, je třeba provést jeho rekonfiguraci!
Poznámka Do verze 2.6 neměl Puppet konfigurační bloky rozdělené podle módů, ale podle jmen démonů, které s nimi pracovaly. Při aktualizaci staršího prostředí je tedy třeba přesunout konfiguraci proměnných do příslušných bloků podle následujícího klíče:
  • puppetd - agent
  • puppetmasterd - master
  • puppet - user
  • puppetca - master

Výchozí hodnoty proměnných lze také jednorázově přenastavit při spouštění démona. Je-li hodnota proměnné typu true, lze na příkazové řádce předat přímo jako parametr název proměnné, doplněný o dvě pomlčky (--). V případě že je typu false musí být před jméno proměnné doplněna ještě předpona no-

# Ekvivalent k listen = true:
$ puppet agent --listen
# Ekvivalent k listen = false:
$ puppet agent --no-listen

U proměnných, které mají obsahovat nějaký řetězec lze provést přiřazení dvěma způsoby

$ puppet agent --certname magpie.example.com
# Nebo s použitím rovnítka:
$ puppet agent --certname=magpie.example.com

Již výše byl uveden příklad, jak zjistit hodnotu proměnné

$ puppet master --configprint ssldir
/etc/puppet/ssl
$ puppet agent --configprint ssldir
/var/lib/puppet/ssl
# nebo:
$ puppet config print ssldir --section master
/etc/puppet/ssl
$ puppet config print ssldir --section agent
/var/lib/puppet/ssl
Upozornění Režim config je poměrně nová záležitost a u verzí Puppetu starších než 3.4 vůbec k dispozici není. Takže nepřekvapí, že vypisovat proměnné podle sekce v níž se nachází lze takto až od verze 3.5 a místo klíčového slova --section by podle oficiální dokumentace mělo fungovat --mode, tudíž do budoucna nelze vyloučit změnu.

Puppet rovněž nabízí parametr, kterým lze vygenerovat konfigurační soubor, který zajistí, aby byl spuštěn v příslušném módu s takovými parametry, jako když je spuštěn s parametry na příkazové řádce.

$ puppet master --genconfig

Přehled nastavení všech proměnných příslušného módu lze zjistit použití klíčového slova all

$ puppet master --configprint all

tagmail.conf

master

Abychom mohli Puppet používat, musíme mít stroj který bude fungovat jako server - master. S ním pak budou komunikovat agenti z ostatních nodů.

Serverová část Puppetu je v Debianu součástí balíku, který se jmenuje puppetmaster. Nainstalovat ji lze přes APT, který by se měl postarat o splnění potřebných závislostí[1]:

Poznámka
 root@master~# apt-get install puppetmaster

http://www.thingsidoinlinuxwhenbored.info/?p=38

Poznámka U výchozí konfigurace serveru na Debianu je úložiště SSL certifikátů v adresáři /var/lib/puppet/ssl. Puppet však používá - není-li uvedeno jinak - jako výchozí adresář /etc/puppet/ssl.

Je-li obsah /etc udržován přes git a etckeeper, je výhodnější používat výchozí nastavení Puppetu. Řádek s nastavením proměnné ssldir v konfiguračním souboru /etc/puppet/puppet.conf stačí zakomentovat a adresář s ssl certifikáty přesunout.


Spouštění serverové části aplikace

To zda démon puppetmaster opravdu běží můžete ověřit buď přímo dotazem přes init skript

Poznámka
 root@master~# /etc/init.d/puppetmaster status
 [ ok ] master is running.

nebo tím, že zkontrolujete zda-li proces master běží

Poznámka
 root@master~# ps -ef | grep master
 puppet    1849     1  0 srp02 ?        00:16:28 /usr/bin/ruby1.8 /usr/bin/puppet master

Pokud master neběží, tak se musí předtím, než se začne pracovat s klientem nahodit. A to buď přes init skript

Poznámka
 root@master~# /etc/init.d/puppetmaster start

nebo manuálně příkazem na řádce[2] - chceme-li mít server spuštěný v ladícím režimu:

Poznámka
 root@master~# puppet master --verbose --debug

agent

Stroje, které chceme spravovat přes Puppet musí mít nainstalovaného agenta, který bude komunikovat se strojem master. V Debianu se balík s agentem jmenuje puppet. I jeho instalaci lze provést jednoduše přes APT:

Poznámka
 root@master~# apt-get install puppet

Agent je nainstalován i na stroji, který v rámci Puppetu funguje jako master, pokud jej chceme rovněž puppetizovat'. Protože na něm běží démon, který pak komunikuje s ostatními agenty, tak jej obvykle začínáme puppetizovat jako první.

Žádost klienta o certifikát

Proces puppetizace začíná tím, že si vystavíme přes agenta SSL certifikát, který se musí na stroji master podepsat. Tímto cesrtifikátem se pak bude šifrovat jejich vzájemná komunikace.

Poznámka
 root@stroj:/etc# puppet agent --noop --test --verbose --server master.felk.cvut.cz
 dnsdomainname: Name or service not known
 info: Creating a new SSL key for stroj.felk.cvut.cz
 info: Caching certificate for ca
 info: Creating a new SSL certificate request for stroj.felk.cvut.cz
 info: Certificate Request fingerprint (md5): 93:44:BC:C1:9F:1D:7E:6D:83:BD:24:E7
 :9A:0A:B3:82
 Exiting; no certificate found and waitforcert is disabled
Upozornění Pokud chceme puppetizovat stroj, který nemá doménový záznam stejný jako aktuální hostname, musí být na klientské stanici - před vydáním žádosti o certifikát pro aktuální hostname - správně uveden záznam v souboru /etc/hosts
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í.


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'

Aby vzájemná komunikace neskončila chybou, musí se po podepsání certifikátu v manifestu vytvořit - nemá-li dosud nakonfigurován výchozí nod default - příslušný nod pro hostname nového klienta.

Poznámka
nod 'stroj' {
        }
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ího certifikátu vypršela platnost, nebo došlo k diskreditaci klienta, musí se nejprve na stroji master odstranit původní podepsaný certifikát a teprve 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 pak je možné vydat novou žádost o certifikát, kterou bude možné na stroji master podepsat.

environment

Puppet umožňuje v rámci jednoho stroje master vytvořit vzájemně nezávislá prostředí (environment).

Každé z nich může mít svůj vlastní manifest i sadu modulů, takže lze udržovat paralelně vedle sebe moduly určené k nasazení v produkčním prostředí s moduly v testovacím prostředí, které se připravují pro budoucí produkční nasazení.

Poznámka Výchozí prostředí, se jmenuje production a tento název je i výchozí hodnotou proměnné $enviroments, kterou používá agent na klientském nodu, pokud se mu nenastaví žádné jiné prostředí.

Vytvoření testovacího prostředí na stroji master

Nové prostředí se vytvoří tak, že se nejprve nastaví v konfiguračním souboru /etc/puppet.conf na stroji master jako nová položka v hranatých závorkách. Jeho název se pak stane obsahem proměnné $environment, kterou lze využít v nastavení cest k výchozímu manifestu a modulům.

Poznámka
[jmeno_prostredi]
manifest = $confdir/$environment/manifests/site.pp
modulepath = $confdir/$environment/modules

Aplikace testovacího prostředí na straně agenta

Pokud se spouští na straně klienta agent jako démon a chceme aby používal místo produkčního prostředí moduly z testovacího prostředí s názvem jmeno_prostredi, pak je třeba do konfigračního souboru /etc/puppet.conf na straně klienta nastavit v sekci agent jako hodnotu proměnné environment jeho jméno.

Poznámka
[agent]
environment = jmeno_prostredi

Automatické spouštění agenta

Pokud nechceme aby se změny realizovaly automaticky, můžeme init skript, přes který se agent spouští jako démon deaktivovat a pak jej spouštět na příkazové řádce ručně. Jméno testovacího prostředí mu pak lze 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.
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


Změna intervalu

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

  1. Ale nemusí. Nastavení potřebných závislostí je totiž u Debianu záležitostí maintainera balíku, který mohl nějaký balík opomenout.
  2. http://docs.puppetlabs.com/man/master.html - viz manuálová stránka