Puppet (typy)
Příklad použití typu
Pro správu souboru /etc/hosts
však můžeme využít existující typ host, přes který lze se záznamy operativně pracovat, aniž by bylo nutné provádět editaci externího souboru.
Typ host pracuje s jednotlivými záznamy. To znamená že v žádném případě původní soubor nepřeplácne. Záznamy, které neodpovídají konfiguraci z původního souboru /etc/hosts
překopíruje tak jak jsou, bez ohledu na to zda-li jde o duplicitní záznam, nebo ne.
Jakmile se rozhodnete pro údržbu souboru /etc/hosts přes Puppet, tak byste si měli být vědomi skutečnosti, že typ host ignoruje veškeré záznamy v tomto souboru které neodpovídají jím generovanému záznamu.
To platí i pro záznamy které byly vytvořeny před modifikací nastavení typu host! Tzn. že před úpravou by měl být záznam nejprve deaktivován přes parametr ensure nastavený na hodnotu "absent", změna realizována a teprve pak lze manifest modifikovat. |
class basic {
host {"git":
ip => '147.32.87.200',
name => 'master',
comment => "Neexistující stroj";
host_aliases => "master.felk.cvut.cz",
ensure => present,
}
}
|
Interpretace tohoto kódu by do souboru /etc/hosts
přidala následující řádek:
...
147.32.87.200 master master.felk.cvut.cz # Neexistující stroj
...
|
Pozn.: Jednotlivé pložky záznamu jsou odděleny tabulátory
V tomto případě bylo použitý typu host vyloženě ilustrativní. Ve skutečnosti je pro vygenerování správného souboru /etc/hosts toho třeba zkombinovat víc - využít podmínky, napsat výchozí šablonu, atd. K tomu už je ovšem vhodnější vytvořit první samostatný modul.
|
Přehled použitelných typů
Toto je pouze reprezentativní výběr námi používaných typů. Pro kompletní dokumentaci viz Docs:Type Reference na oficiálních stránkách stránkách http://puppetlabs.com |
cron
exec
Tento typ spouští skripty a aplikace na straně klienta. Využívá se v případech, kdy je třeba na straně klienta realizovat nějaký příkaz.
Lze ho tedy využít třeba pro elegantní a rychlé vytvoření potřebné adresářové struktury.
exec { "vytvorit_potrebny_adresar":
command => "/bin/mkdir -p /tmp/potrebny/adresar",
creates => "/tmp/potrebny/adresar"
}
|
command
V dřívější implementaci typu exec se příkaz předával rovnou v jeho volání, což bylo nepraktické. Nově se používá parametr command.
Aby se command nevykonával vždy každém průchodu přes exec, tak se používají parametry
- creates
- onlyif
- refresh
- refreshonly
Také lze prostřednictvím následujících parametrů nastavit kde a pod jakým uživatelem, či uživatelskou skupinou má být příkaz spuštěn.
- cwd
- user
- group
Také jsou k dispozici parametry, kterými lze nastavit opakované spuštění příkazu, počet opakování, a časový interval, jak dlouho má agent čekat na dokončení příkazu.
- tries
- try_sleep
- timeout
Do této kategorie spadá také specifický parametr unless, který bude tak dlouho čekat, než dojede exec, dokud mu příkaz v tomto parametru nevrátí hodnotu True.
creates
Parametr creates, který je použitý v ukázkovém příkladu zjišťuje, zda-li cesta, která byla předaná jako hodnota parametru je platná. Pokud ne, tak se spustí nastavený command.
Cest může být předaných jako hodnota parametru i více (jako pole). Ke spuštění příkazu v command však dojde pouze tehdy, nebude-li platná ani jedna z nich.
onlyif
Aby se command nevolal při každém průchodu, lze také ovlivnit přes parametr onlyif. Ten připustí realizaci příkazu v command pouze tehdy, je-li výsledkem všech příkazu v tomto parametru hodnota True.
Následující příklad, demonstruje využití parametru onlyif při instalaci debianích balíčků.
Jsou-li totiž přes typ user udržovány i systémové účty na linuxového systému, mohou postinstalační skripty některých instalačních balíčků (v našem případě půjde o ntp) skončit chybou. Nepočítají totiž s eventualitou, že potřebná skupina i uživatel kterou chtějí vytvořit již v systému existují.
Řešení je prosté - odstranit ze skriptu ntp.postinst
příkazy addgroup a adduser dříve, než dojde k postinstalační konfiguraci.
Níže uvedený blok kódu musí být při použití součástí třídy, která se stará o instalaci balíku ntp |
Kromě metaparametrů notify, require, jimiž se řídí pořadí spouštění dalších operací, obsahuje příklad i další parametry specifické pro typ exec.
refresh
Typ exec je volán obvykle při událostech, parametrem refresh však lze nastavit závislost na jiných operacích
refreshonly
Exec je zavolán pouze tehdy pokud dojde k nějaké změně v rámci závislého objektu. Kupř. tehdy, pokud puppet zaregistruje změnu v konfiguračním souboru
unless
Parametr unless se používá tehdy, má-li příkaz v command běžet tak dlouho, dokud příkaz, který je v parametru nevrátí hodnotu 0 (True).
path
Umožňuje nastavit cesty proměnné PATH, takže v u spouštěných utilit není nutné psát jejich absolutní cestu, která nemusí být na všech strojích stejná.
logoutput
Hodnotou tohoto parametru lze ovlivnit, zda-li bude výstup z příkazu command vypisován do logu (hodnota true) nebo ne (hodnota false).
Výstup je logován na úrovni notice (v případě že je v pořádku) nebo err (dojde-li k chybě)
Nastavením hodnoty na on_failure, lze přesměrovat do logu také chybový výstup příkazu.
timeout
časový interval, po kterém puppet přestane čekat na dokončení příkazu (default je 300 sekund).
Timeout lze vypnout nastavením na hodnotu 0 (nula)
tries
Počet opakování příkazu. Výchozí hodnota je 1, ale v některých přépadech je žádoucí příkaz zavolat opakovaně, dokud se nevrátí návratová hodnota True
try_sleep
Nastavení délky prodlevy (v sekundách) mezi opakováním pokusů při použití tries
cwd
Nastavení adresáře ve kterém se má příkaz command spouštět
group
Skupina v jejímž rámci má běžet spuštěný příkaz command.
user
Nastavení uživatele pod kterým má být příkaz command spuštěn.
enviroment
Umožňuje předat další proměnné prostředí potřebné k realizaci příkazu
returns
Nastavení návratové hodnoty
file
file zajišťuje realizaci veškerých souborových operací.
Parametry
backup
Parametr říká jaké má být cílové úložiště pro zálohu souboru. Defaultně zakládá démon puppetmaster přes typ filebucket úložiště main
u sebe na serveru.
file {"cesta_k_souboru/soubor.txt": source => "/cesta_odkud_se_bere/soubor.txt", backup => main }
Ve výše uvedeném případě, pokud se soubor soubor.txt
liší od verze kopírované z výchozího zdroje, provede agent před nahrazením zálohu do úložiště main.
checksum
Tímto parametrem lze změnit, podle čeho má agent provádět ověření souboru. Výchozí je výpočet kontrolního součtu z obsahu souboru (md5), ale lze kontrolovat i jiné parametry. Což výrazně zkracuje čas který agent stráví ověřováním. Obzvlátě tam, kde jsou přes puppet spravovány velké soubory.
- md5
- md5lite
- mtime
- ctime
- none
content
Hodnota, kterou parametr obsahuje se "nalije" do vytvořeného dokumentu. V manifestu lze použít přímo řetězec, ale i obsah proměnné
owner
purge
replace
source
sourceselect
target
filebucket
Přes typ filebucket se nastavuje úložiště které agent může použít, je-li nastaven parametr backup u file. Samo o sobě je toto nastavení k ničemu, není-li použito.
filebucket {'main': server => puppet, path => false }
Má-li se používat jako výchozí, musí být to být v manifestu nastaveno:
File { backup => main }
Při ověřování se agent v tomto úložišti zeptá, jestli je kontrolní md5 součet souboru který se má nahradit stejný jako má ten soubor co je v úložišti. Pokud ano, tak krok při kterém by měl provést zálohu přeskočí, jelikož není nutný.
Parametry
name
Jméno vzdáleného úložiště.
path
Parametr může mít booleanovskou hodnotu true nebo false.
Je-li hodnota parametru true', použije agent lokální úložiště na klientském nodu.
port
Číslo portu na kterém naslouchá vzdálený server. Pro puppetmaster je výchozí port 8140
server
Doménové jméno serveru, který slouží jako vzdálené úložiště.
Není-li parametr uveden, zkontroluje agent nejprve hodnotu parametru path. Je-li nastaven na true použije lokální úložiště. V opačném případě odzálohuje soubor do výchozího úložiště na stroji kde běží puppetmaster. Tzn. aby agent zálohoval do vzdáleného úložiště musí mít path hodnotu false
group
Parametry
ensure
gid
members
name
provider
system
host
interface
mount
notify
Typ notify je určen k odeslání zprávy, která se má během zpracování manifestu zapíše do logu na straně agenta z místa, kde je umístěn. Do obsahu takové zprávy si lze vypisovat kupř. aktuální hodnoty proměnných, atp.
Při nejjednodušším způsobu použití je zpráva, která se má zobrazit zapsaná rovnou do jména typu.
notify { "Aktuální třída je $name":; }
|
Pokud by však byl tento kód použit v rámci aktuálního scope na více místech, tak by zpracování manifestu skončilo chybou. Puppet totiž vyžaduje, aby žádný objekt v rámci manifestu nebyl duplicitní.
message
Tento problém řeší parametr message, který umožňuje vypsat i poměrně obsáhlé texty
notify { "info":
message => "Zpráva která se má poslat do logu"
}
|
Není-li u notify nastaven parametr message, použije se jako obsah zprávy buď identifikátor objektu - tak jako tomu bylo v předchozím příkladu, nebo jeho alias. (Aliasu lze nastavit parametrem name. |
withpath
Parametr, kterým lze nastavit, jestli se má vypsat zpráva včetně cesty k objektu. Jeho výchozí hodnota je false
notify { "Zpráva která se má poslat do logu":
withpath => true
}
|
package
Typ package s parametrem ensure
nastaveným na installed (nainstalováno)
package { "strace": ensure => "installed" }
Typ package pracuje vždy s výchozím manažerem instalačních balíčků. To však nemusí vždy být zrovna ten, který preferujete. Někdo kupř. upřednostňuje místo konzolových nástrojů pro APT aptitude. Výchozího správce balíků lze nastavit jako hodnotu parametru provider . U Debianu připadají v úvahu prakticky tři možnosti:
Z hlediska základní funkcionality mají všechny tři možnosti zhruba stejné možnosti |
V případě že je třeba nainstalovat více balíčků najednou, lze buď pro každý balík nastavit samostatný typ package ..
package { "strace": ensure => "installed" } package { "screen": ensure => "installed" } package { "less": ensure => "installed" }
Nebo - v případě, že u všech balíků má být hodnota parametru ensure
stejná - lze zápis zjednodušit nastavením globální hodnoty parametru ensure
. Pro typ package, pak bude Puppet automaticky předpokládat že hodnota parametru ensure
je installed.
Package { ensure => "installed" } package { "strace": } package { "screen": } package { "less": }
Místo tupého opakování konfigurace typu package lze s výhodou použít pole:
$baliky = [ "strace", "screen", "less" ] package { $baliky: ensure => "installed" }
Resp.
Package { ensure => "installed" } $baliky = [ "strace", "screen", "less" ] package { $baliky:}
Má-li puppet provádět i automatické aktualizace balíků, pak musí být hodnota parametru ensure latest (nejaktuálnější), nikoliv installed
|
Odebrání balíčku
Aby balíček nebyl nainstalován, resp. v případě že již nainstalován byl byl také odebrán zajistí hodnota ensure
absent (nenainstalovaný), resp purged (kompletně odebraný)
Hodnota purged zajistí, že manažer instalačních balíčků odstraní i veškeré pozůstalé konfigurační soubory |
resources
schedule
service
ssh_authorized_key
Puppet (typy) ssh authorized key