Puppet (funkce)

From DCEwiki
Revision as of 11:33, 25 June 2015 by Keny (talk | contribs) (regsubst)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Puppet umožňuje při generování manifestů používat kromě integrovaných typů také funkce a metody.

Metody[edit]

Metoda, je kontejner definovaný direktivou define, který lze, na rozdíl od třídy, použít opakovaně, s různými parametry - podobně jako funkci, ovšem s tím rozdílem že se volá až při interpretaci manifestu na straně agenta.


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ů.

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

Upozornění 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[edit]

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.

Poznámka
define metoda(
      $parametr = $hodnota,
      $default_parametr = '',
      ) {
      notify { "Hodnota parametru parametr je u položky $name - $parametr":; }
}
 
metoda { [ "A", "B", "C" ]:
      hodnota => "platná"
}
metoda { [ "D", "E", "F" ]:
      hodnota => "neplatná"
}

Výsledkem zpracování výše uvedeného kódu by byly následující vypsané řetězce:

Poznámka
notice: /Stage[main]//Metoda[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]//Metoda[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]//Metoda[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]//Metoda[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]//Metoda[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]//Metoda[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)
$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[edit]

Funkce, jsou programované v ruby, a od metod se liší tím, že je volá při sestavení manifestu na straně serveru master


Poznámka 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[edit]

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í.

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

Upozornění Pozor na rozdíl mezi funkcí file, která načítá obsah souboru a typem file, který pracuje se souborem jako s objektem!

include[edit]

Funkce pro deklaraci instance třídy.

inline_template[edit]

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.

Poznámka
$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[edit]

Funkce, která zapíše obsah předaný jako parametr manifestu do systémového logu (/var/log/syslog) na stroji kde běží Master

regsubst[edit]

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
Poznámka Nahrazení posledního oktetu nulou
$ip = '147.32.87.32'
$subnet = regsubst("$ip", '\d+$', '0')
notify { "$subnet": }
Poznámka 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": }
Poznámka Uzavření IP adresy do závorek
$ip = '147.32.87.32'
$uzavorkovat = regsubst("$ip", '([0-9]+)', '<\1>', 'G')
notify { "$uzavorkovat": }

require[edit]

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

Upozornění 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[edit]

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ý.

Poznámka Rozdělení obsahu proměnné $retezec
$sekana = split($retezec,",")

A použití druhé položky vytvořeného pole $sekana

$druhacastretezce = $sekana[1]
Upozornění 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[edit]

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[edit]

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.