Puppet (typy)

Z DCEwiki
Verze z 24. 4. 2014, 21:04, kterou vytvořil Keny (diskuse | příspěvky) (→‎cron)
(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í
Typy jsou ve své podstatě předdefinované funkce s parametry, které lze využívat při sestavování vlastních funkcí a tříd.


Příklad použití typu

Pro správu souboru /etc/hosts však můžeme využít existující typ host, přes který lze se záznamy operativně pracovat, aniž by bylo nutné provádět editaci externího souboru.

Typ host pracuje s jednotlivými záznamy. To znamená že v žádném případě původní soubor nepřeplácne. Záznamy, které neodpovídají konfiguraci z původního souboru /etc/hosts překopíruje tak jak jsou, bez ohledu na to zda-li jde o duplicitní záznam, nebo ne.

Upozornění Jakmile se rozhodnete pro údržbu souboru /etc/hosts přes Puppet, tak byste si měli být vědomi skutečnosti, že typ host ignoruje veškeré záznamy v tomto souboru které neodpovídají jím generovanému záznamu.

To platí i pro záznamy které byly vytvořeny před modifikací nastavení typu host! Tzn. že před úpravou by měl být záznam nejprve deaktivován přes parametr ensure nastavený na hodnotu "absent", změna realizována a teprve pak lze manifest modifikovat.

Poznámka
class basic {
    host {"git":
        ip => '147.32.87.200',
        name => 'master',
        comment => "Neexistující stroj";
        host_aliases => "master.felk.cvut.cz",
        ensure => present,
        }
}

Interpretace tohoto kódu by do souboru /etc/hosts přidala následující řádek:

Poznámka
...
147.32.87.200	master	master.felk.cvut.cz	# Neexistující stroj
...

Pozn.: Jednotlivé pložky záznamu jsou odděleny tabulátory

Poznámka V tomto případě bylo použitý typu host vyloženě ilustrativní. Ve skutečnosti je pro vygenerování správného souboru /etc/hosts toho třeba zkombinovat víc - využít podmínky, napsat výchozí šablonu, atd. K tomu už je ovšem vhodnější vytvořit první samostatný modul.

Přehled použitelných typů

Poznámka Toto je pouze reprezentativní výběr námi používaných typů. Pro kompletní dokumentaci viz Docs:Type Reference na oficiálních stránkách stránkách http://puppetlabs.com

augeas

Přes typ augeas lze využívat při úpravách konfiguračních souborů Augeas - silný konfigurační nástroj, který umí pracovat s konfiguračními soubory jako s jedním XML dokumentem.

To je výhodné především tehdy, chceme-li pouze modifikovat výchozí konfigurační soubory. Viz ukázkový příklad využití Augeasu pro navýšení výchozích hodnot proměnných post_max_size a upload_max_filesize v konfiguračním souboru php.ini pro webový server apache2.

augeas {'php-config':
      context => "/files/etc/php5/apache2/php.ini/PHP",
      changes => [
              "set post_max_size 8M",
              "set upload_max_filesize 20M",
      ],
}
Poznámka Augeas je komplexní nástroj, jehož možnosti přesahují rámec stručného popisu typu augeas , proto je mu věnovaná samostatná kapitola - Puppet (augeas), která podprobně popisuje také práci s nástrojem pro příkazovou řádku augtool

load_path

Čárkou oddělený seznam adresářů, ve kterých se má hledat parser (lens), kterým se má použít ke zpracování konfiguračního souboru

context

Nastavení kontextu umožňuje použít v příkazech pro augeas relativní cestu

onlyif

Na základě návratové hodnoty zpracovaného příkazu provádí Puppet realizaci. V některých případech by totiž mohl být příkaz pro augeas realizován při každém zpracování manifestu.

returns

Návratová hodnota příkazu zpracovaného přes augeas se použije při dalším zpracování manifestu.

changes

Úpravy které má augeas provést.

root

Výchozí cesta ke konfiguračním souborům ze kterých má být vytvořena stromová struktura - defaultně /etc


cron

K plánovanému spouštění skriptů, v předem nastavených pravidelných intervalech, se v linuxu používá démon cron. Ten běží trvale na pozadí a zhruba každou minutu kontroluje obsah konfiguračních souborů zda-li pro daný čas nemají naplánovanou nějakou úlohu ke spuštění.


Poznámka
cron { 'update_cron':
    ensure  => 'present',
    command => '[ -d /cesta/k/adresáři ] && /volat/tento/skript || mail user@stroj',
    user => 'root', 
    hour => [ 23, 5 ], 
}
Upozornění Nastavení hodin v desetinném tvaru se provádí formou pole, nikoliv s použitím čárky, tak jak je tomu pak v konfiguračním souboru editovatelném přes crontab

Podrobněji se zde cronem, jeho využitím a syntaxí konfiguračních souborů zaobírá samostatný manuál, jehož součástí je i tento ukázkový příklad plánování úlohy prostřednictvím Puppetu.

direction a suivre 3 yve 01.svgČíst dále..


exec

Tento typ spouští skripty a aplikace na straně klienta. Využívá se v případech, kdy je třeba na straně klienta realizovat nějaký příkaz.

Lze ho tedy využít třeba pro elegantní a rychlé vytvoření potřebné adresářové struktury.

Poznámka
exec { "vytvorit_potrebny_adresar":
    command => "/bin/mkdir -p /tmp/potrebny/adresar",
    creates => "/tmp/potrebny/adresar"
}

command

V dřívější implementaci typu exec se příkaz předával rovnou v jeho volání, což bylo nepraktické. Nově se používá parametr command.

Aby se command nevykonával vždy každém průchodu přes exec, tak se používají parametry

  • creates
  • onlyif
  • refresh
  • refreshonly

Také lze prostřednictvím následujících parametrů nastavit kde a pod jakým uživatelem, či uživatelskou skupinou má být příkaz spuštěn.

  • cwd
  • user
  • group

Také jsou k dispozici parametry, kterými lze nastavit opakované spuštění příkazu, počet opakování, a časový interval, jak dlouho má agent čekat na dokončení příkazu.

  • tries
  • try_sleep
  • timeout

Do této kategorie spadá také specifický parametr unless, který bude tak dlouho čekat, než dojede exec, dokud mu příkaz v tomto parametru nevrátí hodnotu True.

creates

Parametr creates, který je použitý v ukázkovém příkladu zjišťuje, zda-li cesta, která byla předaná jako hodnota parametru je platná. Pokud ne, tak se spustí nastavený command.

Cest může být předaných jako hodnota parametru i více (jako pole). Ke spuštění příkazu v command však dojde pouze tehdy, nebude-li platná ani jedna z nich.

onlyif

Aby se command nevolal při každém průchodu, lze také ovlivnit přes parametr onlyif. Ten připustí realizaci příkazu v command pouze tehdy, je-li výsledkem všech příkazu v tomto parametru hodnota True. Kromě následujícího jednoduchého příkladu můžete nalézt další příklady využití parametru onlyif v ukázkových příkladech..

Poznámka
exec { "odstranit-adresar":
    command => "rm -rf /tmp/zbytecny/adresar",
    onlyif => "/tmp/zbytecny/adresar"    
}
refresh

Typ exec je volán obvykle při událostech, parametrem refresh však lze nastavit závislost na jiných operacích

refreshonly

Exec je zavolán pouze tehdy pokud dojde k nějaké změně v rámci závislého objektu. Kupř. tehdy, pokud puppet zaregistruje změnu v konfiguračním souboru

unless

Parametr unless se používá tehdy, má-li příkaz v command běžet tak dlouho, dokud příkaz, který je v parametru nevrátí hodnotu 0 (True).

Poznámka
$kontrola = "2009092501"
$kontrolni_soubor = "/tmp/soubor.serial"
exec { "install-soubor":
    command => "curl -s -o /tmp/soubor.run http://example.com/soubor.run \
                && chmod o+x /tmp/soubor.run \
                && /tmp/soubor.run \
                && echo $kontrola > $kontrolni_soubor",
    unless  => "test $(cat $kontrolni_soubor 2>/dev/null) = $kontrola",
}

path

Umožňuje nastavit cesty proměnné PATH, takže v u spouštěných utilit není nutné psát jejich absolutní cestu, která nemusí být na všech strojích stejná.

logoutput

Hodnotou tohoto parametru lze ovlivnit, zda-li bude výstup z příkazu command vypisován do logu (hodnota true) nebo ne (hodnota false).

Výstup je logován na úrovni notice (v případě že je v pořádku) nebo err (dojde-li k chybě)

Nastavením hodnoty na on_failure, lze přesměrovat do logu také chybový výstup příkazu.

timeout

časový interval, po kterém puppet přestane čekat na dokončení příkazu (default je 300 sekund).

Timeout lze vypnout nastavením na hodnotu 0 (nula)

tries

Počet opakování příkazu. Výchozí hodnota je 1, ale v některých přépadech je žádoucí příkaz zavolat opakovaně, dokud se nevrátí návratová hodnota True

try_sleep

Nastavení délky prodlevy (v sekundách) mezi opakováním pokusů při použití tries

cwd

Nastavení adresáře ve kterém se má příkaz command spouštět

group

Skupina v jejímž rámci má běžet spuštěný příkaz command.

user

Nastavení uživatele pod kterým má být příkaz command spuštěn.

enviroment

Umožňuje předat další proměnné prostředí potřebné k realizaci příkazu

returns

Nastavení návratové hodnoty


file

file zajišťuje realizaci veškerých souborových operací.

backup

Parametr říká jaké má být cílové úložiště pro zálohu souboru. Defaultně zakládá démon puppetmaster přes typ filebucket úložiště main u sebe na serveru.

Poznámka
 file {"cesta_k_souboru/soubor.txt":
         source => "/cesta_odkud_se_bere/soubor.txt",
         backup => main
 }

Ve výše uvedeném případě, pokud se soubor soubor.txt liší od verze kopírované z výchozího zdroje, provede agent před nahrazením zálohu do úložiště main.

checksum

Tímto parametrem lze změnit, podle čeho má agent provádět ověření souboru. Výchozí je výpočet kontrolního součtu z obsahu souboru (md5), ale lze kontrolovat i jiné parametry. Což výrazně zkracuje čas který agent stráví ověřováním. Obzvlátě tam, kde jsou přes puppet spravovány velké soubory.

  • md5
  • md5lite
  • mtime
  • ctime
  • none

content

Hodnota, kterou parametr obsahuje se "nalije" do vytvořeného dokumentu. V manifestu lze použít přímo řetězec, ale i obsah proměnné

owner

purge

replace

source

Místo parametru content lze použít přímo celý soubor, nebo šablonu.

sourceselect

target

Parametr se používá pouze v případě, že je nový objekt typu link. Při vytvoření symbolického linku se použije obsah tohoto parametru k identifikaci cíle.


filebucket

Přes typ filebucket se nastavuje úložiště které agent může použít, je-li nastaven parametr backup u file. Samo o sobě je toto nastavení k ničemu, není-li použito.

filebucket {'main':
     server => puppet,
     path => false
}

Má-li se používat jako výchozí, musí být to být v manifestu nastaveno:

File { backup => main }

Při ověřování se agent v tomto úložišti zeptá, jestli je kontrolní md5 součet souboru který se má nahradit stejný jako má ten soubor co je v úložišti. Pokud ano, tak krok při kterém by měl provést zálohu přeskočí, jelikož není nutný.

name

Jméno vzdáleného úložiště.

path

Parametr může mít booleanovskou hodnotu true nebo false.

Je-li hodnota parametru true', použije agent lokální úložiště na klientském nodu.

port

Číslo portu na kterém naslouchá vzdálený server. Pro puppetmaster je výchozí port 8140

server

Doménové jméno serveru, který slouží jako vzdálené úložiště.

Není-li parametr uveden, zkontroluje agent nejprve hodnotu parametru path. Je-li nastaven na true použije lokální úložiště. V opačném případě odzálohuje soubor do výchozího úložiště na stroji kde běží puppetmaster. Tzn. aby agent zálohoval do vzdáleného úložiště musí mít path hodnotu false


group

ensure

gid

members

name

provider

system


host

Puppet (typy) host

interface

Puppet (typy) interface

mount

Puppet (typy) mount

notify

Typ notify je určen k odeslání zprávy, která se má během zpracování manifestu zapíše do logu na straně agenta z místa, kde je umístěn. Do obsahu takové zprávy si lze vypisovat kupř. aktuální hodnoty proměnných, atp.

Při nejjednodušším způsobu použití je zpráva, která se má zobrazit zapsaná rovnou do jména typu.

Poznámka
notify { "Aktuální třída je $name":; }
Poznámka
Jul 30 18:37:19 git puppet-agent[24898]: Aktuální třída je ntp::install
Jul 30 18:37:19 git puppet-agent[24898]: (/Stage[main]/Ntp::Install/Notify[Aktuální
třída je ntp::install]/message) defined 'message' as 'Aktuální třída je ntp::install'

Pokud by však byl tento kód použit v rámci aktuálního scope na více místech, tak by zpracování manifestu skončilo chybou. Puppet totiž vyžaduje, aby žádný objekt v rámci manifestu nebyl duplicitní.

message

Tento problém řeší parametr message, který umožňuje vypsat i poměrně obsáhlé texty

Poznámka
notify { "info":
        message => "Zpráva která se má poslat do logu"
        }
Poznámka Není-li u notify nastaven parametr message, použije se jako obsah zprávy buď identifikátor objektu - tak jako tomu bylo v předchozím příkladu, nebo jeho alias. (Aliasu lze nastavit parametrem name.

withpath

Parametr, kterým lze nastavit, jestli se má vypsat zpráva včetně cesty k objektu. Jeho výchozí hodnota je false

Poznámka
notify { "Zpráva která se má poslat do logu":
        withpath => true
        }
Poznámka
Jul 30 18:38:41 git puppet-agent[25045]: (/Stage[main]/Git::Config/Notify[Zpráva 
která se  poslat do logu]/message) Zpráva která se  poslat do logu
Jul 30 18:38:41 git puppet-agent[25045]: (/Stage[main]/Git::Config/Notify[Zpráva 
která se  poslat do logu]/message) defined 'message' as 'Zpráva která se má poslat
do logu'


package

Typ package s parametrem ensure nastaveným na installed (nainstalováno)

package { "strace": ensure => "installed" }
Poznámka Typ package pracuje vždy s výchozím manažerem instalačních balíčků. To však nemusí vždy být zrovna ten, který preferujete. Někdo kupř. upřednostňuje místo konzolových nástrojů pro APT aptitude. Výchozího správce balíků lze nastavit jako hodnotu parametru provider. U Debianu připadají v úvahu prakticky tři možnosti:
  • apt
  • aptitude (může lépe zpracovávat vzájemné závislosti mezi balíky)
  • dpkg (neumožňuje používat pro ensure hodnotu latest)

Z hlediska základní funkcionality mají všechny tři možnosti zhruba stejné možnosti

V případě že je třeba nainstalovat více balíčků najednou, lze buď pro každý balík nastavit samostatný typ package ..

package { "strace": ensure => "installed" }
package { "screen": ensure => "installed" }
package { "less": ensure => "installed" }

Nebo - v případě, že u všech balíků má být hodnota parametru ensure stejná - lze zápis zjednodušit nastavením globální hodnoty parametru ensure. Pro typ package, pak bude Puppet automaticky předpokládat že hodnota parametru ensure je installed.

Package { ensure => "installed" }
package { "strace": }
package { "screen": }
package { "less": }

Místo tupého opakování konfigurace typu package lze s výhodou použít pole:

$baliky = [ "strace", "screen", "less" ]
package { $baliky: ensure => "installed" }

Resp.

Package { ensure => "installed" }
$baliky = [ "strace", "screen", "less" ]
package { $baliky:}
Poznámka Má-li puppet provádět i automatické aktualizace balíků, pak musí být hodnota parametru ensure latest (nejaktuálnější), nikoliv installed

Odebrání balíčku

Aby balíček nebyl nainstalován, resp. v případě že již nainstalován byl byl také odebrán zajistí hodnota ensure absent (nenainstalovaný), resp purged (kompletně odebraný)

Poznámka Hodnota purged zajistí, že manažer instalačních balíčků odstraní i veškeré pozůstalé konfigurační soubory

resources

Puppet (typy) resources

schedule

Puppet (typy) schedule

service

Puppet (typy) service

ssh_authorized_key

Puppet (typy) ssh authorized key

sshkey

Puppet (typy) sshkey

user

Puppet (typy) user