Puppet (chyby)

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

Nelze stáhnout katalog

Tato chybová zpráva se objevuje pokud z nějakého důvodu master odmítá komunikaci s klientem. K tomu může dojít z více různých příčin.

Neběží master

Při pokusu o stažení manifestu...

err: Could not retrieve catalog from remote server: Connection refused - connect(2)

Při pokusu o získání certifikátu...

err: Could not request certificate: Connection refused - connect(2)

Problém v síti

Pokud spouštíme agenta jako démona, pak můžeme narazit v souboru /var/log/daemon.log na následující chybovou hlášku...

Error: Failed to apply catalog: getaddrinfo: Name or service not known

Znamená, že je problém v nastavení DNS záznamu pro master - agent nemůže získat z DNS jeho adresu. Při jednorázovém spouštění agenta z příkazové řádky lze přidat volbu --server se jménem cílového stroje.

Je-li agent spouštěn jako démon, tak si ji vytahuje z DNS. Nemá-li určeno jinak, hledá v doméně stroj se jménem puppet. Pokud cílový master nemá takový DNS záznam, pak je třeba do konfiguračního souboru agenta /etc/puppet/puppet.conf nastavit jako hodnotu proměnné server v bloku [main] jeho IP adresu, nebo přidělené doménové jméno.

Upozornění Pokud se taková chyba objeví, a stroj má nastavený DNS záznam, pak to signalizuje, že je nějaký problém s překladem adres. Který je nutné ošetřit. Může to být chybná adresa v souboru /etc/resolv.conf, výpadek DNS serveru, aj.

Obejít to lze uvedením alternativního jména puppet příslušného stroje v souboru /etc/hosts.

Problémy spojené s certifikátem

  • Je-li na klientské stanici, nebo na stroji master rozhozený čas, tak se může objevit následující chybové oznámení, které se zdánlivě týká certifikátu...
Error: Could not request certificate: SSL_connect returned=1 errno=0 state=unknown state: certificate verify failed: [certificate is not yet valid for /CN=Puppet CA: temporary.felk.cvut.cz]
  • Certifikát, který má klient k dispozici aktuální master neautorizoval, nebo z nějakého důvodu došlo k jeho revokaci - odvolání...
err: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server session ticket A: sslv3 alert certificate revoked
  • Také mohl stroj používat původně jiný master...
err: Could not retrieve catalog from remote server: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed. This is often because the time is out of sync on the server or client

Nejprve je třeba zkontrolovat, jestli pro příslušného klienta není nějaký certifikát na stroji master vydaný.

Pokud ano, tak je třeba nejprve provést odstranění původního certifikátu.

Protože klient má u sebe má v podadresáři /var/lib/puppet certifikát a soubory, které jsou už neplatné, musí se před vygenerováním nové žádosti odstranit.

support (KVM) :~# find /var/lib/puppet -type f -print0 | xargs -0r rm

Teprve pak lze vygenerovat novou žádost o certifikát , kterou je nutné na stroji master opět podepsat.

Chybějící nastavení nodu v manifestu

  • Překlep v definici názvu klientského nodu
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find default node or by name with 'temporary.felk.cvut.cz, temporary.felk.cvut, temporary.felk, temporary' on node temporary.felk.cvut.cz

Je třeba zkontrolovat, zda-li definice nodu v manifestu odpovídá jménu, kterým se klient identifikuje vůči stroji master.

Problém s konfigurací

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not parse for environment production: Is a directory @ io_fread - /etc/puppet/manifests/site.pp:1 on node temporary.felk.cvut.cz

Manifest site.pp není soubor, ale adresář. To je přípustné pouze pokud se nepoužívají různá prostředí (environment).

Problém s UTF-8

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not parse for environment production: invalid byte sequence in US-ASCII at /etc/puppet/manifests/nodes.pp:1 on node temporary.felk.cvut.cz

Chyba se objevuje na straně agenta, pokud soubor manifestu, který je na stroji master obsahuje znaky v kódování UTF-8. Příčinou je, že ve chvíli kdy se spouští master ještě nejsou nastaveny locales, po manuálním restartu na konzoli stroje master, která má nakonfigurované locales problém zmizí.

Lze jí předcházet dvěma způsoby:

Manifesty bez diakritiky

Pokud se při psaní manifestů nepoužívá diakritika, a i případné komentáře se píší pokud možno bez ní, pouze v angličtině tak k ní nebude docházet.

Upozornění Pokud se chyba vyskytne a restart serverové části nepomůže, pak je třeba z manifestu, který je uveden v chybovém hlášení, odstranit všechny non-ASCII znaky.

Nastavení locales v souboru /etc/default/puppetmaster

Jak musí každý rozumný člověk uznat, předchozí řešení ve skutečnosti není řešení, ale pouhá obezlička. Problém tedy vyřeší vložení následujícího řádku na konec souboru /etc/default/puppetmaster

export LANG=cs_CZ.UTF-8

Problém na straně agenta

Problém s locales se ovšem může objevit i na straně agenta, pokud ho spouštíme jako démona. V takovém případě můžeme narazit v souboru /var/log/daemon.log na podobnou hlášku, jako je ta níže uvedená..

Could not prefetch package provider 'apt': invalid byte sequence in US-ASCII

Řešení je v tomto případě stejné jako u serveru - přidat export správné hodnoty systémové proměnné LANG do souboru /etc/default/puppet.

Upozornění V tomto případě je situace poněkud záludnější, protože instalační balíky pro agenta soubor /etc/default/puppet neobsahují a tudíž se musí vytvořit.

Chyba v syntaxi manifestu

Vůbec nejčastější příčinou je chyba v syntaxi. Pozitivní je, že výpis obsahuje i upřesnění ve kterém souboru a na kterém řádku je třeba chybu hledat.

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not parse for environment testing: Syntax error at '{'; expected '}' at /etc/puppet/environments/testing/manifests/nodes.pp:149 on node temporary.felk.cvut.cz

Příliš velký request

Upozornění Jde o problém, který se týká klientů verze starší než 2.7, které neumějí v případě potřeby přepnout z metody GET na POST. Řešením je aktualizace klienta
err: Could not retrieve catalog from remote server: Error 414 on SERVER: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>Request-URI Too Large</TITLE></HEAD>
  <BODY>
    <H1>Request-URI Too Large&lp;/H1>
    WEBrick::HTTPStatus::RequestURITooLarge
    <HR>
    <ADDRESS>
     WEBrick/1.3.1 (Ruby/2.1.2/2014-05-08) OpenSSL/1.0.1g at
     localhost:8140
    </ADDRESS>
  </BODY>
</HTML>
 
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run

Aplikace neexistující třídy

K této chybě může dojít buď díky překlepu, nebo pokud nejsou splněny všechny závislosti i modulů. Níže uvedený ukázkový výpis chyby obsahuje upozornění, že v manifestu stroje temporary.felk.cvut.cz je použita třída s názvem 'tree', která však neexistuje. To může být relikt a nebo naopak třída kterou je nutno zahrnout do závislostí modulu.

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class tree for temporary.felk.cvut.cz on node temporary.felk.cvut.cz

Chybějící šablona či neplatná cesta k šabloně

Šablona z modulu

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find template 'temporary/test_source_on_master' at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:243 on node temporary.felk.cvut.cz
file {"/tmp/subdir/test.txt":
    content => template("temporary/test_source_on_master"),
    ensure => present,
}

Šablona z centrálního úložiště

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find template 'test_source_on_master' at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:243 on node temporary.felk.cvut.cz
file {"/tmp/subdir/test.txt":
    content => template("test_source_on_master"),
    ensure => present,
}

Šablona identifikovaná absolutní cestou

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template /etc/puppet/environments/testing/modules/support/files/test_source_on_master:
Filepath: /usr/lib/ruby/vendor_ruby/puppet/parser/templatewrapper.rb
Line: 100
Detail: No such file or directory - /tmp/test_source_on_master
at /etc/puppet/environments/testing/modules/support/manifests/init.pp:243 on node temporary.felk.cvut.cz
file {"/tmp/subdir/test.txt":
    content => template("/tmp/test_source_on_master"),
    ensure => present,
}

Chyby při použití zdrojových souborů

Při použití typu file se může stát že..

  • je překlep v cestě k souboru, ze kterého se má obsah vzít.
  • na cílovém místě zdrojový soubor chybí.

Chybějící soubor či neplatná cesta k souboru

Cesta k souboru z centrálního úložiště

err: Failed to apply catalog: Parameter source failed: Cannot use relative URLs 'test_source_on_master' at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:245

Není-li v cestě uveden žádný název modulu, pak se automaticky předpokládá, že je soubor uložen v centrálním úložišti Puppetu - obvykle adresář /etc/puppet/files

file {"/tmp/subdir/test.txt":
    source => "test_source_on_master",
    ensure => present,
}

Neplatná absolutní cesta k souboru

err: /Stage[main]/Temporary::Novell/File[/tmp/subdir/test.txt]: Could not evaluate: Could not retrieve information from environment testing source(s) file:/tmp/test_source_on_master at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:245

Je-li cesta k souboru uvedena absolutně - začíná lomítkem - pak odpovídá cestě k souboru v rámci souborového systému stroje master.

file {"/tmp/subdir/test.txt":
    source => "/tmp/test_source_on_master",
    ensure => present,
}

Chybějící soubor v úložišti modulu

err: /Stage[main]/Temporary::Novell/File[/tmp/subdir/test.txt]: Could not evaluate: Could not retrieve information from environment testing source(s) puppet:///modules/temporary/test_source_on_master at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:245

Je-li zdrojový soubor v úložišti, které je součástí nějakého modulu v aktuálním prostředí (environment), pak musí být cesta nastavena relativně vůči prostředí. V takovém případě se pak zdrojový soubor test_source_on_master hledá v úložišti files, které je součástí modulu temporary. A absolutní cesta k souboru test_source_on_master se bude lišit podle prostředí, které agent použije.

file {"/tmp/subdir/test.txt":
    source => "puppet:///modules/temporary/test_source_on_master",
    ensure => present,
}

V tomto případě by tedy byl soubor

Neplatná cesta na straně klienta

err: /Stage[main]/Temporary::Novell/File[/tmp/subdir/test.txt]/ensure: change from absent to present failed: Could not set 'present on ensure: No such file or directory - /tmp/subdir/test.txt at /etc/puppet/environments/testing/modules/temporary/manifests/init.pp:244

Tato specifická chyba se objeví, pokud podadresář /tmp/subdir, ve kterém má soubor (nebo podadresář) založit neexistuje. Typ file totiž nefunguje rekurzivně. Tento problém je tedy nutno ošetřit přímo v manifestu a to tak, aby příslušný podadresář klient založit ještě před cílovým souborem.

file {[ "/tmp/subdir", "/tmp/subdir/test.txt"]:
    ensure => present,
}

Chyby při použití typu exec

Při použití typu exec se může chyba vyskytnout jak v syntaxi typu, tak v příkazech, které má tento typ realizovat..

Chybná cesta k souboru

exec {"get-pwd":
    command => "pwd",
    ...
}

Zpracování takto uvedeného příkazu skončí následující chybou, nemáme-li globálně nastavenou cestu ke spustitelným souborům.

Error: Failed to apply catalog: Validation of Exec[get-pwd] failed: 'pwd' is not qualified and no path was specified. Please qualify the command or specify a path. at /etc/puppet/environments/testing/modules/nfs/manifests/init.pp:86
Wrapped exception:
'get-pwd' is not qualified and no path was specified. Please qualify the command or specify a path.

Řešení je dvojí

Nastavení plné cesty ke spustitelnému souboru

Je nejjednodušší, ale v takovém případě musí být absolutní cesta nastavena u všech souborů se kterými pracuje parametr command.

exec {"get-pwd":
    command => "/bin/pwd ...",
    ...
}

Nastavení parametru path

Je výhodnější, protože pak není nastavení absolutní cesty k souborům použitým v parametru command nutné. Absolutní cestu je třeba v takovém případě mít pouze u souborů, které jsou mimo cesty v parametru path.

exec {"get-pwd":
    path => "/bin:/usr/bin:/sbin/usr:/sbin",
    command => "pwd ...",
    ...
}

Jiný návratový kód než 0

Typ exec neskončí chybou pouze za předpokladu, že všechny příkazy v parametru command skončí návratovým kódem 0.

V případě, že je návratový kód jiný, dojde k chybě a přerušení dalšího zpracování. Ve výpisu se pak objeví podobné oznámení jako je uvedeno níže..

Error: /usr/bin/gcc nfshomechown.c -o /etc/pam-scripts/nfshomechown -Wall returned 4 instead of one of [0]
Error: /Stage[main]/Nfs/Exec[compile-nfshomechown]/returns: change from notrun to 0 failed: /usr/bin/gcc nfshomechown.c -o /etc/pam-scripts/nfshomechown -Wall returned 4 instead of one of [0]

V zásadě máme dvě možnosti jak postupovat dál.

Akceptování návratového kódu

Pokud nemá návratový kód vliv na další zpracování, můžeme pomocí parametru returns, určit jaké hodnoty návratového kódu má typ exec považovat za úspěch

exec {"prikaz_je_zpracovani":
    ...
    returns => [0, 4],
    ...
}

Podrobnější výpis

Obvykle má ale návratový kód svůj význam, který je důležitý pro zjištění co je vlastně špatně. Pro takový případ lze při spouštění agenta použít parametr --detailed-exitcodes, který zajistí podrobnější výpis realizace typu exec . Ve výpisu se tak ještě před vlastním oznámením chyby objeví další informace, které k ní vedly.

root@stroj :~# puppet agent --test --verbose --detailed-exitcodes

Viz podrobnější výstup k chybě ve výše uvedeném příkladu:

Notice: /Stage[main]/Nfs/Exec[compile-nfshomechown]/returns: gcc: error: nfshomechown.c: Adresář nebo soubor neexistuje
Notice: /Stage[main]/Nfs/Exec[compile-nfshomechown]/returns: gcc: fatal error: no input files
Notice: /Stage[main]/Nfs/Exec[compile-nfshomechown]/returns: compilation terminated.

Z něj už bylo možné zjistit, že ke zkompilování zdrojového souboru nfshomechown.c nedošlo z toho důvodu, že gcc k němu nenalezlo cestu.

Chyby při generování dokumentace

Dokumentaci generovanou z manifestů je třeba generovat vždy do neexistujícího adresáře, jinak příkaz skončí chybou. Je to z toho důvodu, abychom si omylem nepřepsali jiný obsah. To však neplatí, pokud se jedná o aktualizaci dokumentace.


Chyba při generování dokumentace pro jiné než výchozí prostředí

Error: Could not run: no implicit conversion of Symbol into String

V takovém případě musí být příkaz doplněn o atribut --environment

Chyby při práci s moduly