Puppet (manifest)

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

U Debianu je bezprostředně po instalaci adresář /etc/puppet/manifests prázdný a skript pro sestavení manifestu je nutno teprve vytvořit.

Soubor, kterým začíná sestavení manifestu je site.pp.

V podstatě by bylo možné napsat všechno sem, ale v záhy by se stal takový skript nepřehledný. Proto je lepší konfiguraci rozdělovat na více souborů a ty pak postupně načítat přes direktivu import.

Proměnné

Soubor site.pp je ideálním místem pro umístění globálních proměnných. Každá proměnná existuje pouze v rámci svého jmenného prostoru, který se označuje jako scope. Pokud Puppet během zpracování manifestu v aktuálním jmenném prostoru nenajde, prohledá scope nejvyšší úrovně, kterým je výchozí soubor site.pp.

Promměné z jiných scope lze volat pouze jejich plným jménem, které tvoří jméno příslušného jmenného prostoru a název proměnné.

$<jmenný prostor proměnné>::<proměnná>
  • Jméno proměnné začíná vždy znakem '$' (znak DOLLAR)
  • K přiřazení hodnoty se používá operátor = (znak "rovná se..").
  • Proměnná může obsahovat řetězec, číslo, pravdivostní hodnotu (false, undef,..), pole nebo kontrolní součet.
  • Proměnnou lze předat jako hodnotu parametru, ale také se dá použít jako jméno zdroje. Zdrojem se rozumí soubor operací, uzavřený ve složených závorkách { }.
  • Proměnné se dají vkládat do řetězců, které musí být uzavřené do uvozovek (znak ").
  • Proměnná, které nebyla přiřazen žádná hodnota vrací řetězec undef
Poznámka Některé verze puppetu mají bug, které při volání globálních proměnných a vyžadují při jejich volání prefix '$::'
Upozornění V rámci scope lze proměnné přiřadit hodnotu pouze jedenkrát. Tzn. že globální proměnné, které již hodnotu mají, nelze přenastavit.

Příklad obsahu výchozího souboru /etc/puppet/manifests/site.pp

Poznámka
$puppetserver = 'master.felk.cvut.cz'
import 'nodes.pp'

Z příkladu je zřejmé, že kromě direktivy import, která bude do manifestu integrovat obsah souboru nodes.pp je nastavena také proměnná $puppetserver, ve které je uloženo doménové jméno stroje master, na kterém běží démon z balíku puppetmaster

Fakta

Při psaní manifestu lze používat pouze proměnné, ale pro šablony je dostupný ještě jeden zdroj informací - fakta

Fakta jsou informace dostupné pouze na straně klienta, proto se nedají použít při psaní manifestu. V šablonách, které se interpretují až na straně klienta však s nimi lze pracovat stejně jako s proměnnými, což umožňuje generovat konfigurační soubory přímo na míru stroje.


Jaká fakta jsou na nodu dostupná, lze zjistit utilitou facter.

Třídy

Kromě nastavení nodů obsahuje soubor nodes.pp z našeho příkladu také definici společné třídy basic, která se aplikuje na všech nodech, které si ji přes direktivu include natáhnou.

Třída zahrnuje veškeré operace potřebné pro sestavení manifestu.

Operace, které lze realizovat v rámci tříd se označují jako Puppet (typy). Také lze používat nejrůznější stavové podmínky, využívat integrované funkce, používat šablonování, definovat další třídy a také volat třídy z jiných modulů. Viz ukázka zavolání třídy subclass z modulu modul:

Poznámka
class basic {
      include modul::subclass
    }

Nastavení nodu a použití regulárních výrazů

Na názvech importovaných souborů vcelku nezáleží. Důležité je, aby aby měly příponu ".pp". Soubor nodes.pp z našeho příkladu obsahuje seznam nodů, které mají být přes Puppet spravovány.

Direktivou node jsou v něm přiřazeny k sadě instrukcí, která se má použít pro sestavení manifestu ověřovací identifikátory, podle kterých se ověřuje doménoví jméno, pod kterým se ohlásil agent.

Poznámka Jelikož veškerá komunikace probíhá přes SSL, musí být na stroji master certifikát, který si vyžádal agent nejprve ověřen. Bez něj by totiž master s agentem vůbec nekomunikoval. Identifikátor (doménové jméno stroje ze kterého se agent ohlásil) je součástí tohoto ověřeného certifikátu.

Jako identikátor se může použít celé doménové jméno, ale stačí i jeho zkrácená verze. Pokud identifikátor SSL certifikátu, kterým se agent autorizuje vůči stroji master vyhoví nastavenému řetězeci, pak budou nastavené operace použity při sestavení jeho manifestu.

Viz příklad obsahu výchozího souboru /etc/puppet/manifests/nodes.pp :

Poznámka
 #
 # NODE CONFIGURATION
 #
 class basic {
 	}
 node 'master.felk.cvut.cz' {
 	include basic
 	}

Má-li být definice nodu společná více strojům, lze provést přiřazení buď jejich vyjmenováním..

Poznámka
    node 'www.felk.cvut.cz', 'www2.felk.cvut.cz', 'www3.testing.com' {
      include basic
    }

..nebo nastavením regulárního výrazu. Jako regulární výraz bere master řetězec tehdy, jsou-li místo uvozovek použita lomítka

Poznámka
node /^www\d+$/ {
      include basic
    }

Předchozímu regulárnímu výrazu by vyhověly všechny stroje, jejichž (zkrácené) doménové jméno by začínalo řetězcem www následovaným číselnou hodnotou - bez ohledu na doménu ze které by lezly.

Upozornění Bude-li v manifestu nakonfigurováno více nodů, který by vyhověl identifikátor agenta, pak Puppet pro sestavení manifestu použije ten, kterému jméno agenta vyhoví nejdřív.

Dá se ale použít i složitější podmínka, která vymezí nod pouze vůči strojům petr a pavel z domény felk.cvut.cz.

Poznámka
node /^(petr|pavel)\.felk\.cvut\.cz$/ {
      include basic
    }

default

Normálně se chová Puppet tak, že agenta, jehož doménové jméno, ať plné, nebo zkrácené, nevyhoví žádnému identifikátoru ignoruje.

Jsou však situace, kdy chceme zpuppetizovat každý stroj, bez ohledu na to jaký identifikátor nod pošle. Pro takový případ je třeba založit v manifestu nod default

Poznámka
node default {
      include basic
    }

Manifest pro údržbu souboru /etc/hosts

Puppet (příklady) basic