Puppet (soubory)

Z DCEwiki
Verze z 22. 6. 2015, 13:04, kterou vytvořil Keny (diskuse | příspěvky) (→‎Rekurzivní vytvoření cílového adresáře)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
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 typy jako je např. user, hosts, & etc.

Pro jejich nahrazení se používá typ file. Ten může pro obsah budoucího konfiguračního souboru použít vygenerovaný obsah, uložený v proměnné, nebo jej načíst ze souboru uloženého na stroji master. Šablony umožňují integrovat obsah z uloženého souboru s kódem programovacího jazyka ruby.

Použití souboru

Příkladem souboru, jehož obsah je v rámci jedné sítě stejný na všech strojích, může být soubor /etc/resolv.conf, kterým se nastavují doménové servery (DNS). Chceme-li zajistit aby byl tento soubor k dispozici pro každý puppetizovaný stroj, stačí do nodu, kterým se sestavuje jeho manifest, umístit typ file, s parametrem source, ve kterém bude cesta k souboru, kterým agent - v případě že jeho obsah nebude shodný s obsahem lokálního souboru /etc/resolv.conf - cíl přeplácne.

Cesta ke zdrojovému souboru může být nastavena absolutně, vůči souborovému systému stroje kde běží Master..

Poznámka
class basic {
    file {"/etc/resolv.conf":
        source => "/etc/puppet/manifests/obsah_pro_resolv.conf",
    }
}

Aby agent neskončil chybou:

  1. Soubor /etc/puppet/manifests/obsah_pro_resolv.conf musí existovat
  2. Jeho obsah musí být univerzálně použitelný
  3. Cesta k souboru musí být uvedena absolutně
  4. A serverová část Puppetu musí mít do místa kde je uložen přístupová práva[1]
Upozornění Na rozdíl od pevných linků (hardlinky) jsou symbolické linky samostatné soubory, které obsahují pouze ukazatel na jiný soubor. Pokud má typ file použít jako zdroj symlink, pak vytvoří na straně nodu zase symlink, který bude odkazovat na stejný cíl. Ale protože nepracuje s obsahem cílového souboru, může vzniknout - na rozdíl od hardlinku - neplatný symlink!

Použití absolutní cesty k souboru ale není praktické. Puppet proto předpokládá, že moduly, ze kterých se na stroji Master sestavuje manifest pro agenta obsahují adresář files, ve kterém jsou soubory, které si má zkopírovat do svého systému. Máme-li tedy výchozí soubor uložen v adresáři files, modulu basic, můžeme nastavit cestu k tomuto souboru takto:

Poznámka
class basic {
    file {"/etc/resolv.conf":
        source => "puppet:///modules/basic/obsah_pro_resolv.conf",
    }
}

V případě, že nechceme mít takový soubor umístěn v rámci modulu, záleží na nastavení v souboru fileserver.conf, kde se nastavuje cesta k centrálnímu úložišti souborů a také povoluje přístup agentů k jeho obsahu.

Poznámka
class basic {
    file {"/etc/resolv.conf":
        source => "puppet:///files/obsah_pro_resolv.conf",
    }
}

Identifikace konfiguračního souboru s využitím proměnné

Má-li se obsah souboru /etc/resolv.conf lišit podle domény nodu, lze udržovat pro každou z nich samostatný soubor. Aby pak Puppet věděl, který má zrovna použít, lze využít proměnnou $domain, nebo $hostname - má-li být obsah souboru specifický pro určitý konkrétní nod.

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

Puppet tak v případě nodu v doméně 'doma' použije soubor hosts.doma a v případě nodu v doméně 'work' bude hledat soubor hosts.work. Atp.

Zapsání obsahu proměnné do cílového souboru

V případě jednoduchých konfiguračních souborů lze obsah cílového souboru dynamicky sestavit do proměnné v rámci manifestu, a její obsah pak zapsat do cílového souboru prostřednictvím parametru content. Takovým souborem může být kupř. /etc/hosts. Možnost upravovat jeho obsah na jednom místě je rozhodně výhodnější než udržovat samostatný soubor pro každý stroj zvlášť.

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 cílového souboru do proměnné ze souboru

V případě rozsáhlejších souborů lze kombinovat použití proměnných s načtením společného obsahu do proměnné ze souboru uloženého na stroji Master 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í.

Symlinky a adresáře

Symlinky i adresáře jsou specifickým druhem souborů, proto i pro jejich správu lze využívat typ file. To zda-li je cílovým objektem adresář, symlink, nebo soubor, určuje parametr ensure. V případě adresáře, u kterého nezáleží na přístupových právech není žádný jiný parametr zapotřebí.

Poznámka
file {"/etc/hosts":
    ensure => directory,
}

Ale pomocí dalších parametrů lze zajistit, aby měl takový adresář správně nastaveného vlastníka, skupinu a přístupová práva. Těmito parametry lze ošetřit správné nastavení adresářů (i souborů), tam kde by mohla případná změna v přístupových právech představovat bezpečnostní riziko.

Poznámka
file {"/users":
    mode => 777,
    owner => root,
    group => users,
    ensure => directory,
}

Symbolický link musí mít kromě příslušné hodnoty parametru ensure uveden také parametr target. Bez něj by skončil agent chybou.

Poznámka
file {"/cesta_k_symlinku":
    target => "../cilovy_soubor",
    ensure => link,
}

Rekurzivní vytvoření cílového adresáře

Upozornění Typ file pracuje vždy pouze s jedním objektem. Nepracuje však rekurzivně. V případě že adresář, ve kterém má být objekt vytvořen neexistuje, skončí agent chybou.

Pokud je ovšem zdrojovým souborem adresář, pak ho překopíruje včetně obsahu tak jak je.

  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.