Puppet (moduly)

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

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 to z praktického hlediska nesmysl, protože by se stal záhy nepřehledný.

Proto se třídy deklarované v hlavním manifestu udržují je v samostatných modulech. Implementace tříd v modulech by měla být v maximální míře univerzální, tak aby bylo možné moduly distribuovat a sdílet (viz Práce s moduly).

Nezbytné konfigurační volby by měly být předány při deklaraci tříd jako jejich parametry.

Moduly

V deklaraci nodu se třída nadeklarovaná v modulu natahuje přes direktivu include stejným způsobem, jako kdyby byla součástí výchozího manifestu.

Nenajde-li Puppet v režimu master, který sestavuje katalog, třídu ve výchozím manifestu, předpokládá její výskyt ve stejnojmenném modulu.

Ve té nejprostší podobě tak modul vypadá jako adresář, v úložišti modulů na stroji kde je master, se stejným názvem, jako má použitá třída. Ten obsahuje podadresář manifests se souborem init.pp, ve kterém je deklarovaná.

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

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

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

  1. /etc/puppet/environments/testing/modules/basic/manifests/init.pp
  2. /etc/puppet/modules/basic/manifests/init.pp
  3. /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.

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

Poznámka
 file {"cesta_k_souboru/soubor.txt":
         content => template("hosts/hosts_sablona.erb",
 }

Dokumentování modulů

Dokumentace ke třídám a metodám v modulu se tvoří úplně stejným způsobem, jako když se dokumentuje kód manifestu.

Kromě podrobné dokumentace jednotlivých metod a tříd však můžeme mít zpracovanou také globální dokumentaci 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

Soubor README se nachází v kořeni modulu a pokud nemá příponu .rdoc, nebo .md, která by specifikovala použitou formátovací konvence, tak se předpokládá, že je obsah formátovaný pomocí rdoc. Při generování dokumentace do HTML se jeho obsah sloučí s dokumentací veřejných metod, které jsou dokumentovány v kódu, takže lze na ně odkazovat skrze hyperlinky[1].

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

Jak už bylo zmíněno hned v úvodu této kapitoly, kód v modulech by měl být v maximální míře obecný a univerzálně použitelný. Napsat takový modul však není nic jednoduchého. Proto firma Puppet Labs, která vývoj Puppetu zaštiťuje, od verze 2.7.10 nabízí jeho uživatelům možnost vytvořené moduly sdílet prostřednictvím úložiště na serveru Puppet Forge.

Nástroj pro práci s moduly, který umí také pracovat s tímto úložištěm, je v Puppetu integrován. takže vyhledávat vhodné moduly a instalovat je do lokálního úložiště modulů lze rovnou z příkazové řádky.

Vyhledání a instalace modulu z úložiště na Puppet Forge

Instalace modulu z lokálního tarballu

Přehled nainstalovaných modulů

Odebrání modulu

Příprava vlastních modulů pro Puppet Forge

Modulefile

Založení nového modulu

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

Zabalení modulu do tarballu

  1. To ovšem neplatí pokud budou použity k formátování dokumentace značky pro Markdown (soubor README.md)