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ý. Základ pro manifest je nutno teprve vytvořit.

Jako první se při sestavování manifestu z tohoto adresáře načítá soubor site.pp. V podstatě by bylo možné napsat všechno sem, ale v reálu je lepší konfiguraci rozdělit do více souborů, a ty pak postupně načíst přes direktivu import.

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, se kterou pak bude možné dále pracovat. V ní je uloženo doménové jméno stroje master, na kterém běží démon z balíku puppetmaster

Proměnné

  • Proměnné začínají vždy znakem '$' (znak DOLLAR), za kterým následuje jméno.
  • K přiřazení hodnoty do proměnné 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í je soubor operací, uzavřený ve složených závorkách { }.
  • Proměnné se dají vkládat do řetězců, které ale musí být uzavřené do uvozovek (znak ").

Příklad použití proměnné v řetězci

  • Je-li někde použitá proměnná, která není nadefinovaná, vrací Puppet řetězec undef

Prostor, ve kterém lze proměnnou volat pouze přes její jméno, se označuje jako scope. Při použití proměnné, která patří do jiného prostoru musí být uvedena plná cesta.

$<jmenný prostor proměnné>::<proměnná>

Odkazuje-li se na proměnnou pouze přes její jméno, a ona v aktuálním jmenném prostoru není nijak nastavená, pokračuje Puppet tím, že prohledá nejvyšší úroveň jmenného prostoru. Takže k volání globálních proměnných, které byly nastaveny na nejvyšší úrovni (v souboru site.pp) stačí pouze jméno.

Příklad volání proměnných

Poznámka Některé verze puppetu mají bug, který by měl být ovšem u budoucích verzí odstraněn a vyžadují k jejich zavolání prefix '$::'
Upozornění Proměnná může být na aktuální úrovni jmenného prostoru přiřazena pouze jednou. Proměnné nastavené na globální úrovni tedy nelze přenastavit.

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.

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
    }

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, který se pak agent na vzdáleném nodu pokusí zpracovat.

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
    }

Manifest pro údržbu souboru /etc/hosts

Puppet (příklady) basic