Puppet (chyby)
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.
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.
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
.
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
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
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