Puppet umožňuje při generování manifestů používat také funkce. Kromě integrovaných funkcí lze vytvořit a používat také vlastní funkce.
Funkce je kontejner, definovaný direktivou define, ve kterém je kód, který může dále zpracovávat hodnoty předané přes parametry, nebo na jejich základě modifikovat obsah manifestu. Z hlediska použití se taková funkce chová stejně jako ty integrované.
Volání funkce bez parametru
|
define funkce {
notify { "Do funkce je předán pouze parametr - $name":; }
}
funkce { 'jmeno':; }
|
Výsledkem zavolání této funkce by bylo pouze vypsání textového řetězce 'Do funkce je předán pouze parametr - jmeno' do logu klienta (přes notify). Nicméně k demonstraci výsledku tento jednoduchý příklad stačí.
Je-li místo konkrétního jména předáno pole, nebo proměnná, která pole obsahuje, volá se funkce pro každou položku pole zvlášť, přičemž obsah proměnné $name
bude vždy odpovídat této položce. Více v následujícím příkladu.
Volání funkce s parametrem
Funkci lze volat také s parametrem.
|
define funkce($parametr) {
notify { "Hodnota parametru parametr je u položky $name - $parametr":; }
}
funkce { [ "A", "B", "C" ]:
parametr => "platná"
}
funkce { [ "D", "E", "F" ]:
parametr => "neplatná"
}
|
Výsledkem výše uvedeného kódu by byly následující vypsané řetězce:
|
notice: /Stage[main]//Funkce[C]/Notify[Hodnota parametru parametr je u poloÅky C - platnÃ]/
message: is absent, should be Hodnota parametru parametr je u poloÅky C - platnà (noop)
notice: /Stage[main]//Funkce[F]/Notify[Hodnota parametru parametr je u poloÅky F - neplatná]/
message: is absent, should be Hodnota parametru parametr je u poloÅky F - neplatná (noop)
notice: /Stage[main]//Funkce[A]/Notify[Hodnota parametru parametr je u poloÅky A - platnÃ]/
message: is absent, should be Hodnota parametru parametr je u poloÅky A - platnà (noop)
notice: /Stage[main]//Funkce[D]/Notify[Hodnota parametru parametr je u poloÅky D - neplatná]/
message: is absent, should be Hodnota parametru parametr je u poloÅky D - neplatná (noop)
notice: /Stage[main]//Funkce[B]/Notify[Hodnota parametru parametr je u poloÅky B - platnÃ]/
message: is absent, should be Hodnota parametru parametr je u poloÅky B - platnà (noop)
notice: /Stage[main]//Funkce[E]/Notify[Hodnota parametru parametr je u poloÅky E - neplatná]/
message: is absent, should be Hodnota parametru parametr je u poloÅky E - neplatná (noop)
|
Praktický příklad
Následující ukázka kódu v manifestu zajistí aktivaci a deaktivaci modulů pro apache2
|
define apachemode($status) {
file { "/etc/apache2/mods-available/$name.conf":
ensure => present,
}
exec { "akce-$name-$status":
command => "$status $name",
path => "/usr/bin:/bin:/usr/sbin:/sbin"
}
}
$disable = [ 'auth_digest', 'info' ]
$enable = [ "ssl" ]
apachemode { $enable:
status => "a2enmod"
}
apachemode { $disable:
status => "a2dismod"
}
|
Moduly které se mají aktivovat jsou v uloženy jako položky pole v proměnné $enable
a ty které se v konfguraci vyskytnout nesmí jsou v proměnné $disable
. Kód sám by byl nejspíš součástí třídy pro konfiguraci serveru apache2.
|
Kód je opravdu velmi zjednodušený, protože nemá optimálně ošetřen test konfiguračního souboru. Tak jak je to teď totiž v případě neexistujícího modulu dojde k vytvoření prázdného souboru. Bez ohledu na to ale akce exec skončí chybovou hláškou, takže vcelku o nic nejde.
Upozorňuji také na to, že jak jméno položky, tak jméno parametru se musí použít pro sestavení jména pro typ exec. Boz toho by při dalším průchodu Puppet oznámil chybu, jelikož se v manifestu nemohou vyskytovat dva objekty se stejným jménem.
|
|
define kontejner {
$promenna_k_nalezeni = "VARIABLE";
$promenna_k_zobrazeni = inline_template("<%= scope.lookupvar($promenna_k_nalezeni) %>")
notify { "Obsah proměnné ke zobrazení je $promenna_k_zobrazeni":; }
}
kontejner { $konfigurak_ke_zpracovani:; }
|
V uvedeném příkladu je v nadefinované uživatelské funkci kontejner zavolaná vestavěná funkce inline_template, která zajistí, že složený řetězec bude interpretován jako šablona
Je-li pak Do nadefinovaného typu s názvem kontejner
se pošle řetězec obsažený v proměnné $konfigurak_ke_zpracovani
. Ten pak na tento řetězcový obsah aplikuje funkci scope.lookupvar která ověřuje výskyt nastavení proměnné s názvem VARIABLE.
Pokud se v řetězci takové nastavení vyskytne, je tato proměnná interpretována šablonou vytvořenou funkcí inline_template a výsledek zpracování je pak skrze notify zapsán do logu.
Přehled vestavěných funkcí
file
Funkce se dá použít v podmínkách vložení pravdivostní hodnoty do proměnné, kterou lze následně využít v podmínkách.
$etckeeper = file('/etc/.git')
Vrací True pokud na na straně agenta existuje /etc/.git
.
include
Puppet (funkce) include
inline_template
Puppet (funkce) inline template
regsubst
Puppet (funkce) regsubst
require
Puppet (funkce) require
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ý.
$sekana = split($retezec,",")