Puppet (šablony)
Puppet umožňuje na klientské straně zpracovávat konfiguraci několika způsoby.
- modifikací již existujících konfiguračních souborů
- nahrazením stávajících, či vytvořením nových konfiguračních souborů
K modifikaci existujících konfiguračních souborů lze používat již existující typy (např. user, hosts, aj.).
K jejich nahrazení se používá typ file. Ten může použít výchozí obsah vygenerovaný v rámci manifestu, nebo načtený ze souboru uloženého na stroji master. Šablony umožňují generovat obsah konfiguračního souboru s využitím proměnných a programovacího jazyka ruby.
Hotové konfigurační soubory
Začínáme-li se s psaním manifestů teprve seznamovat, je nejlepší začít souborem /etc/hosts , který je nezbytnou součástí každého linuxového stroje a na kterém nelze vcelku nic zkazit.
|
Nejjednodušším způsobem, jak zajistit aby byl tento soubor k dispozici na každém nodu je umístit do třídy basic typ file s parametrem source, s cestou k souboru, kterým agent cílový soubor - v případě že se liší - přeplácne.
Použití jednotného konfiguračního souboru
class basic {
file {"/etc/hosts":
source => "/etc/puppet/manifests/obsah_pro_hosts",
}
}
|
V tomto případě je třeba splnit několik podmínek:
- Soubor musí existovat
- Musí mít univerzálně použitelný obsah
- Cesta k němu musí být uvedena absolutně
- A serverová část Puppetu musí mít do místa kde je uložen přístup[1]
Využití proměnné
a
Má-li se obsah tohoto souboru lišit podle nodu, lze udržovat pro každý z nich samostatný soubor. Aby pak Puppet věděl, který má zrovna použít, lze využít proměnné $hostname
class basic {
file {"/etc/hosts":
source => "/etc/puppet/manifests/hosts_$hostname.conf",
}
}
|
Puppet tak v případě nodu s hostname 'jedna' použije soubor s hosts_jedna.conf
a v případě nodu s hostname 'dva' soubor hosts_dva.conf
Zapsání obsahu proměnné do souboru
Než udržovat samostatné soubory, může být pro někoho pohodlnější obsah rovnou vložit do proměnné v manifestu, a pak jej zapsat prostřednictvím parametru content
Načtení obsahu do proměnné ze souboru
V případě rozsáhlejších souborů lze zkombinovat použití proměnných s načtením společného obsahu do proměnné ze souboru prostřednictvím funkce file:
U řetězců do kterých se vkládají proměnné, jejichž obsah má být na samostatném řádku je třeba umístit konec řádku '\n' . Bez něj by byl obsah proměnných vypsán za sebou, bez odřádkování.
|
- ↑ U modulů lze parametr source používat s adresou
puppet:///modules/nazev_modulu/soubor_s_obsahem
. Master pak hledá soubor v adresářifiles
, který je součástí modulu.
Šablony
Pro jednoduché konfigurační soubory lze využít funkci inline_template., která interpretuje jako obsah šablony textový řetězec
Pro rozsáhlejší konfigurační soubory je výhodnější použít šablonu uloženou v samostatném souboru. K jejímu načtení se použije funkce template. Ta jednak hledá šablonu automaticky v adresáři /etc/puppet/templates
, tudíž není nutné hlídat správnost cesty k souboru a navíc klient na straně nodu zpracuje soubor jako šablonu. Takže na straně stroje master není třeba nic víc, než v manifestu uvést jakou má vzít šablonu.
class basic {
file {"/etc/hosts":
content => template("hosts.erb"),
}
}
|
Obsah šablony hosts.erb
je pak následující:
127.0.0.1 localhost localhost.localdomain
<%= ipaddress -%> <%= hostname -%> <%= fqdn %>
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
|
I když šablony pracují s proměnnými a umožňují používat funkce a jiné věci, nejsou stejným typem souboru jako ty, které se používají pro sestavení manifestu a které zpracovává master na straně serveru. Proto se také odlišují příponou '.erb' ač při jejich zpracování na příponě vůbec nezáleží.
Šablony umožňují vkládat mezi tagy '<% %>'
kód v Ruby - jazyce, ve kterém je naprogramován celý Puppet. O jeho interpretaci na straně nodu se pak stará klient, který si šablonu stáhne. V šablonách lze využívat všech možností objektového programování, ale na většinu věcí postačí využít podmínek, smyček a proměnných.
Rozdíly v použití proměnných oproti Puppetu
- U proměnných v šblonách se neuvádí počáteční znak '$' (string)
- "Vytištění" proměnné se zajistí, když se umístí za počáteční tag znak '=' (rovnítko)
'<%= %>'
- Nemá-li dojít k odřádkování jednotlivých bloků kódu, lze potlačit konec řádku tím, že se před uzavírací tag umístí znak '-' (mínus)
'<%= promenna -%><%= dalsi_promenna -%>'
Použití smyčky v šabloně
Kód manifestu, ve kterém se nastaví obsah proměnné $servers
(pole)
class basic {
$servers = [ "10.0.0.1 nod-1",
"10.0.0.2 nod-2",
"10.0.0.3 nod-3", ]
file {"/etc/hosts":
content => template("hosts.erb"),
}
}
|
Obsah šablony hosts.erb
, ve které se na straně klienta přes smyčku zpracuje obsah proměnné $servers
A ukázka obsahu výsledného souboru /etc/hosts
Kód v šabloně i manifestu lze pochopitelně dále vypilovat, ale to už je mimo rámec tohoto seznámení se šablonami.