Puppet (šablony)

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

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

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

Poznámka
class basic {
    file {"/etc/hosts":
        source => "/etc/puppet/manifests/obsah_pro_hosts",
    }
}

V tomto případě je třeba splnit několik podmínek:

  1. Soubor musí existovat
  2. Musí mít univerzálně použitelný obsah
  3. Cesta k němu musí být uvedena absolutně
  4. 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

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

Poznámka
class basic {
    $hosts = "127.0.0.1 localhost localhost.localdomain
$ipaddress $hostname $hostname.felk.cvut.cz
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
"
    file {"/etc/hosts":
        content => $hosts,
    }
}

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:

Poznámka
class basic {
    $hosts_lo = "127.0.0.1 localhost localhost.localdomain"
    $hosts_main = "$ipaddress $hostname $hostname.felk.cvut.cz"
    $hosts_other = file("/etc/puppet/manifests/obsah_pro_hosts")
    file {"/etc/hosts":
        content => "$hosts_lo\n$hosts_main\nhosts_other",
    }
}
Poznámka 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í.
  1. U modulů lze parametr source používat s adresou puppet:///modules/nazev_modulu/soubor_s_obsahem. Master pak hledá soubor v adresáři files, který je součástí modulu.

Šablony

Použití samostatné šablony

Místo kombinace z předchozího příkladu je lepší použít k načtení obsahu souboru funkci 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.

Poznámka
class basic {
    file {"/etc/hosts":
        content => template("hosts.erb"),
    }
}

Obsah šablony hosts.erb je pak následující:

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

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

Poznámka
127.0.0.1 localhost localhost.localdomain
<%= ipaddress -%> 
<%= hostname -%> 
<%= fqdn %>
<% servers.each do | server | -%>
<%= server %>
<% end -%>
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters

A ukázka obsahu výsledného souboru /etc/hosts

Poznámka
127.0.0.1 localhost localhost.localdomain
147.32.87.200 master master.felk.cvut.cz
10.0.0.1      nod-1
10.0.0.2      nod-2
10.0.0.3      nod-3
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters

Kód v šabloně i manifestu lze pochopitelně dále vypilovat, ale to už je mimo rámec tohoto seznámení se šablonami.


Puppet (příklady) practiced