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 |
augeas
Přes typ augeas lze využívat při úpravách konfiguračních souborů Augeas - silný konfigurační nástroj, který umí pracovat s konfiguračními soubory jako s jedním XML dokumentem.
To je výhodné především tehdy, chceme-li pouze modifikovat výchozí konfigurační soubory. Viz ukázkový příklad využití Augeasu pro navýšení výchozích hodnot proměnných post_max_size
a upload_max_filesize
v konfiguračním souboru php.ini
pro webový server apache2.
augeas {'php-config':
context => "/files/etc/php5/apache2/php.ini/PHP",
changes => [
"set post_max_size 8M",
"set upload_max_filesize 20M",
],
}
Augeas je komplexní nástroj, jehož možnosti přesahují rámec stručného popisu typu augeas , proto je mu věnovaná samostatná kapitola - Puppet (augeas), která podprobně popisuje také práci s nástrojem pro příkazovou řádku augtool |
load_path
Čárkou oddělený seznam adresářů, ve kterých se má hledat parser (lens), kterým se má použít ke zpracování konfiguračního souboru
context
Nastavení kontextu umožňuje použít v příkazech pro augeas relativní cestu
onlyif
Na základě návratové hodnoty zpracovaného příkazu provádí Puppet realizaci. V některých případech by totiž mohl být příkaz pro augeas realizován při každém zpracování manifestu.
returns
Návratová hodnota příkazu zpracovaného přes augeas se použije při dalším zpracování manifestu.
changes
Úpravy které má augeas provést.
root
Výchozí cesta ke konfiguračním souborům ze kterých má být vytvořena stromová struktura - defaultně /etc
cron
K plánovanému spouštění skriptů, v předem nastavených pravidelných intervalech, se v linuxu používá démon cron. Ten běží trvale na pozadí a zhruba každou minutu kontroluje obsah konfiguračních souborů zda-li pro daný čas nemají naplánovanou nějakou úlohu ke spuštění.
cron { 'update_cron':
ensure => 'present',
command => '[ -d /cesta/k/adresáři ] && /volat/tento/skript || mail user@stroj',
user => 'root',
hour => [ 23, 5 ],
}
|
Nastavení hodin v desetinném tvaru se provádí formou pole, nikoliv s použitím čárky, tak jak je tomu pak v konfiguračním souboru editovatelném přes crontab |
Podrobněji se zde cronem, jeho využitím a syntaxí konfiguračních souborů zaobírá samostatný manuál, jehož součástí je i tento ukázkový příklad plánování úlohy prostřednictvím Puppetu.
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. Kromě následujícího jednoduchého příkladu můžete nalézt další příklady využití parametru onlyif v ukázkových příkladech..
exec { "odstranit-adresar":
command => "rm -rf /tmp/zbytecny/adresar",
onlyif => "/tmp/zbytecny/adresar"
}
|
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í.
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
Místo parametru content lze použít přímo celý soubor, nebo šablonu.
sourceselect
target
Parametr se používá pouze v případě, že je nový objekt typu link. Při vytvoření symbolického linku se použije obsah tohoto parametru k identifikaci cíle.
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ý.
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
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