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,
    }
}
  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í š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