Puppet (funkce)
Puppet umožňuje při generování manifestů používat kromě integrovaných typů také funkce a metody.
Metody
Obsahem kontejneru je kód, kterým můžeme dále modifikovat výsledek zpracování manifestu, na základě lokálních fakt a předaných parametrů.
define metoda {
notify { "Metodě byl předán pouze parametr - $name": }
}
metoda { 'jmeno': }
|
Výsledkem zavolání této metody by bylo pouze vypsání textového řetězce 'Metodě byl předán pouze parametr - jmeno' do logu na straně agenta (přes notify). Nicméně pro demonstraci použití metody tento jednoduchý příklad stačí.
Ačkoliv metoda vypadá z hlediska syntaxe zápisu i použití podobně jako parametrizovaná třída, funguje jinak.
Zatím co třídu lze v rámci jednoho jmenného prostoru (scope) deklarovat pouze jednou, ať již s parametry nebo bez, metody lze volat opakovaně. S jedinou podmínkou, a to, že jméno objektu vytvořeného pomocí metody nebude stejné jako má jiný, již existující objekt. V takovém případě agent při zpracování manifestu oznámí chybu a přeruší proces jeho zpracování. |
Parametry
Je-li místo textového řetězce metodě předáno pole, nebo proměnná, která pole obsahuje, volá se metoda pro každou položku pole zvlášť, přičemž obsah proměnné $name
bude vždy odpovídat jménu aktuální položky. Jak je demonstrováno v následujícím příkladu použití parametrizované metody.
Výsledkem zpracování výše uvedeného kódu by byly následující vypsané řetězce:
- $name
- Je parametr kterým disponuje metoda vždy, neboť se do něj při volání metody ukládá jméno volané položky seznamu.
- $parametr
- Je parametr, do kterého se při volání metody přiřadí hodnota atributu $hodnota. Tento atribut musí být při volání metody nastaven vždy. Kdyby tomu tak nebylo, skončilo by zpracování metody chybou.
- $default_parametr
- Demonstruje implementaci parametru, který při volání metody nastaven být může, ale nemusí. V takovém případě se při zpracování metody použila jeho deklarovaná hodnota - byť by šlo o prázdný řetězec.
Funkce
Toto je pouze malý přehled použitelných funkcí. Pro jejich kompletní přehled viz dokumentaci Docs: Function Reference na oficiálních stránkách stránkách http://puppetlabs.com |
file
Parametrem funkce file je seznam jednoho a více URL souborů, které se agent postupně pokusí vyhledat. Funkce pak načte obsah prvního platného souboru na který narazí.
$ntp_conf = file('/etc/ntp.conf', '/etc/openntpd/ntpd.conf')
|
U výše uvedeného příkladu načte agent obsah konfiguračního souboru pro NTP démona do proměnné $ntp_conf
, se kterou lze dále pracovat.
Pozor na rozdíl mezi funkcí file, která načítá obsah souboru a typem file, který pracuje se souborem jako s objektem! |
include
Funkce pro deklaraci instance třídy.
inline_template
Vestavěná funkce inline_template umožňuje interpretovat textový řetězec stejným způsobem, jako by šlo o šablonu.
Textový řetězec, který je výsledkem interpretace lze využít při dalším zpracování manifestu.
$ip = 'IP'
$setip = inline_template("$ip=<%= ipaddress %>")
notify { "$setip": }
|
Výsledkem zpracování ukázkového kódu je sestavení řetězce, který lze kupř. vložit do konfiguračního souboru, který vyžaduje k proměnné IP
přiřazenou aktuální IP adresu klienta. Výsledený řetězec na stroji s IP adresou 10.0.0.103 pak bude vypadat takto:
IP=10.0.0.103
Metaparametr notify je v příkladu uveden pouze pro kontrolní výpis obsahu proměnné $setip
do logu.
notice
Funkce, která zapíše obsah předaný jako parametr manifestu do systémového logu (/var/log/syslog
) na stroji kde běží Master
regsubst
Je funkce, která dovoluje v rámci manifestu pracovat s řetězcovým obsahem proměnných a tak generovat proměnné nové. Obsahem proměnné může být i pole. Funkce pak bude aplikována na všechny jeho položky.
regsubst( vstup, regexp, náhrada[, flagy[, kódování]] )
- vstup
- Řetězec, nebo pole řetězců, se kterými bude funkce pracovat
- regexp
- Regulární výraz, kterým se vymezí textový řetězec k nahrazení, pokud ho vstup bude obsahovat. V regulárních výrazech můžeme použít znaky: \d pro číslice; ^ pro začátek řádku; $ pro konec řádku; . (tečku) pro jeden libovolný znak; + pro opakování znaků stejného typu; * pro libovolné znaky
- náhrada
- Řetězec, kterým bude nahrazen řetězec vymezený parametrem regexp. Nalezený řetězec můžeme nahradit zcela novým řetězcem, ale také jej můžeme vložit jako součást náhrady. Pokud použijeme
\0
, tak se vloží tak jak je;\1
, atp. vkládá části ze kterých se skládá, jsou-li vymezené kulatými závorkami. - flagy
- Parametry, ovlivňující zpracování regulárního výrazu (lze kombinovat):
- E - Povolit rozšířené regulární výrazy
- I - Ignorovat v regulárních výrazech malá a velká písmena
- M - Aplikovat regulární výraz přes více řádek
- G - Aplikovat nahrazení globálně. Bez tohoto parametru se nahradí pouze první výskyt.
- kódování
- Parametr, kterým lze změnit nastavení kódování při zpracování řetězce. To je důležité u řetězců s multibajtovými znaky (může zvolena být pouze jedna hodnota z uvedených:
- N - žádné
- E - EUC
- S - SJIS
- U - UTF-8
Nahrazení posledního oktetu nulou
$ip = '147.32.87.32'
$subnet = regsubst("$ip", '\d+$', '0')
notify { "$subnet": }
|
Výpis třetího oktetu z IP adresy
$ip = '147.32.87.32'
$treti_oktet = regsubst("$ip", '^(\d+)\.(\d+)\.(\d+).(\d+)$', '\3')
notify { "$treti_oktet": }
|
Uzavření IP adresy do závorek
$ip = '147.32.87.32'
$uzavorkovat = regsubst("$ip", '([0-9]+)', '<\1>', 'G')
notify { "$uzavorkovat": }
|
require
Je funkce pro deklaraci tříd na nichž je závislé zpracování objektu, v jehož kontextu se funkce volá. Na rozdíl od funkce include není při jejím použití nutné explicitní určení závislosti
Pozor na rozdíl mezi funkcí require, která provádí deklaraci tříd a metaparametrem require, kterým se nastavují vzájemné závislosti mezi objekty! |
split
Funkce rozseká obsah proměnné, která je předaná jako první parametr. Jako rozdělovací řetězec použije řetězec, který následuje jako parametr druhý.
Rozdělení obsahu proměnné $retezec
$sekana = split($retezec,",")
A použití druhé položky vytvořeného pole $druhacastretezce = $sekana[1]
|
Pozor na funkci split, jde-li o master server v distribuci Debian squeezy (verze 2.6.2). Bug, který byl opraven od verze 2.6.3 tuto funkci neumožňuje použít! Nefunguje správně vytvoření pole. |
Debugovací funkce
Jejich pomocí lze do kódu manifestu integrovat nejrůznější kontrolní výpisy a upozornění. Ty se pak podle nastavené úrovně logování zapisují do systémového logu stroje kde běží master.
- alert
- crit
- debug
- info
- notice
- emerg
- err
- warning
fail
Umožňuje nastavit podobně jako debugovací funkce řetězec, který se vypíše jako chyba, která se vyskytla během během zpracování manifestu, ovšem tentokrát na straně agenta.