Puppet (moduly)
V kapitole věnované seznámení se strukturou manifestu bylo v odstavci o třídách uvedeno několik ukázkových příkladů vytvoření a implementace třídy. I když třídy mohou být součástí hlavního manifestu, je lepší udržovat je v samostatných modulech.
V deklaraci nodu se taková třída natahuje přes direktivu include stejným způsobem, jako kdyby byla součástí výchozího manifestu.
Master, pokud nenajde deklarovanou třídu ve výchozím manifestu, předpokládá, že ji nalezne ve stejnojmenném modulu.
Ve té nejprostší podobě je modul adresář, v úložišti modulů, na stroji kde běží master, co má stejný název, jako hledaná třída. Ten obsahuje podadresář manifests
se souborem init.pp
, ve kterém je deklarovaná třída.
init.pp
Je výchozí soubor modulu, ve kterém je deklarovaná třída a s implementovanými typy, které se pak budou zpracovávat na straně agenta.
V rámci modulu můžeme tvořit další podtřídy, které lze rovněž deklarovat v souboru init.pp
, nebo v dalších souborech v rámci adresáře manifest
. Každý z nich musí mít název podtřídy a příponu .pp
.
Následující ukázkový kód demonstruje deklaraci třídy "hosts" ve stejnojmenném modulu, která si přes direktivu include natahuje ze souboru s názvem config.pp
podtřídu "hosts::config". Před implementací kódu této podtřídy bude aplikován typ file, přes který budeme zakládat na straně agenta soubor /etc/hosts
.
Obsah souboru init.pp
je tedy prozatím následující:
class hosts {
file {"/etc/hosts":
content => template("obsah_pro_hosts"),
}
include hosts::config
}
|
Obsahem dalšího souboru s názvem config.pp
bude podtřída modulu "hosts" - "hosts::config", která bude obsahovat typ host, přes který lze spravovat jednotlivé záznamy v souboru /etc/hosts
. V ukázkovém příkladu přidává pouze jeden záznam a to nastavení jména pro IP adresu stroje master:
class hosts::config {
host {"master":
ip => '147.32.87.200',
name => 'master',
comment => "Puppetmaster",
host_aliases => "master.felk.cvut.cz",
ensure => present,
}
}
|
Podtřídy
V adresáři manifests
mohou být další podadresáře. Puppet pak automaticky chápe soubory v nich umístěné jako podtřídy.
Aby bylo možné k nim uvést dokumentaci, je třeba do nich přidat soubor init.pp
, a v něm podtřídu deklarovat jako obvykle, nebo lze dokumentaci podtřídy (podadresáře) a její deklaraci umístit do výchozího init.pp
celého modulu
Úložiště modulů
Puppet může mít prostřednictvím proměnné $modulepath nastaveno více než jedno úložiště modulů. Na prvním místě je, coby jako výchozí úložiště, adresář modulů příslušného prostředí. Za ním, odděleny dvojtečkou, mohou být uvedeny další cesty. Nepracuje-li agent v odděleném prostředí, jsou moduly obvykle umístěny v adresáři /etc/puppet/modules
.
user@stroj~$ sudo puppet agent --configprint modulepath
/etc/puppet/environments/testing/modules:/etc/puppet/modules:/usr/share/puppet/modules
Třídu "basic" z ukázkové deklarace nodu by tedy master postupně hledal v souborech:
/etc/puppet/environments/testing/modules/basic/manifests/init.pp
/etc/puppet/modules/basic/manifests/init.pp
/usr/share/puppet/modules/basic/manifests/init.pp
Pro další proces zpracování manifestu akceptuje master vždy pouze první deklaraci třídy, na kterou narazí.
Pokud ji nikde nenajde, skončí proces generování manifestu chybovým oznámením.
Struktura modulu
Kromě povinného adresáře manifests
se mohou v kořeni modulu vyskytnout i další soubory a adresáře. Z hlediska sestavení manifestu jsou významné především tyto dva:
files
Je adresář ve kterém jsou uloženy soubory a adresáře, které se mají distribuovat tak jak jsou (ssh klíče, výchozí konfigurační soubory aj.). Agent k nim přistupuje přes filebucket v rámci jmenného prostoru příslušného modulu. Není tak nutné si hlídat absolutní cesty v rámci souborového systému stroje master.
file {"/etc/hosts":
source => "puppet:///modules/hosts/hosts_default",
}
|
templates
Je adresář, do kterého se ukládají šablony. Šablony jsou soubory s příponou .erb, jejichž obsah může být je během zpracování modifikován díky vloženým kouskům interpretovaného kódu programovaného v ruby.
file {"cesta_k_souboru/soubor.txt":
content => template("hosts/hosts_sablona.erb",
}
|
Dokumentace modulu
Dokumentace ke třídám a metodám v modulu se tvoří úplně stejným způsobem, jako dokumentace v manifestu.
Kromě toho však lze mít ještě zpracovanou globální dokumentaci k modulu v souboru README. Ten se umisťuje do kořene modulu a může mít případně také příponu .rdoc, nebo .md podle použité formátovací konvence.
README
U soubor README bez přípony se předpokládá že má obsah formátovaný pomocí značek rdoc. Při generování dokumentace se pak k jeho obsahu integruje také dokumentace veřejných metod z kódu modulu.
- README.rdoc
- musí mít obsah formátovaný jako rdoc, stejně jako dokumentace v kódu. Pouze s tím rozdílem, že nejde interpretované komentáře, tudíž řádky nezačínají znakem #
- README.md
- musí mít obsah formátovaný jako markdown. V tomto případě však vygenerovaná dokumentace nebude zkombinována s dokumentací k veřejným metodám.
Práce s moduly
Modulefile
Soubor určený pro práci s moduly v rámci Puppetu (viz níže). Novějších verze Puppetu už místo něj používá soubor metadata.json
metadata.json
Soubor s informacemi o modulu pro práci s moduly v rámci Puppetu (viz níže).