Puppet (funkce)

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

Puppet umožňuje při generování manifestů používat také funkce. Kromě integrovaných funkcí lze se vytvářet také funkce vlastní, přes direktivu define, které se pak z hlediska použití chovají úplně stejně.

Funkce je kontejner, co obsahuje kód, který může dál zpracovávat předané parametry.

Volání funkce bez parametru

Poznámka
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.

Poznámka
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:

Poznámka
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

Poznámka
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.

Poznámka 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.



Poznámka
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.


Puppet (příklady) advanced




Přehled vestavěných funkcí

Poznámka Toto je pouze úzký výběr námi používaných funkcí. Pro kompletní dokumentaci viz Docs:Type Reference na oficiálních stránkách stránkách http://puppetlabs.com

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,",")