Używam ściśnięcia Debiana z PostgreSQL 9.1 z backportów. Puppet ma wersję 2.7.14. Niestety skrypt inicjujący zwraca zły kod wyjścia dla statusu. Dlatego napisałem niestandardowe status
polecenie, aby wykryć, czy postgresql działa, czy nie.
service { 'postgresql':
ensure => running,
enable => true,
hasstatus => false,
hasrestart => true,
status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if ($4 != \"online\") rc=3} END { exit rc }'",
provider => debian,
}
Moje polecenie działa jak czar, ale wydaje się, że marionetka ma problem. Zawsze dostaję, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'
chociaż już działa.
Więc wypróbowałem następujące:
service { 'postgresql':
ensure => running,
enable => true,
hasstatus => false,
hasrestart => true,
status => "exit 0",
provider => debian,
}
Jak rozumiem to niestandardowe status
polecenie, marionetka powinna zawsze myśleć, że działa postgresql. Niemniej jednak marionetka próbuje za każdym razem rozpocząć postgresql.
Co jest moją winą? Czy jest to błąd w marionetce?
provider => init
(i usunąćenable
parametr).status
polecenie kukiełki działa zgodnie z oczekiwaniami!Odpowiedzi:
Moje najlepsze przypuszczenia to to, że
$4
twój dowódca zostaje pochłonięty przez własną interpolację marionetki iexit 0
to nie działa właściwie z powodu problemów z interakcją powłoki.Spróbowałbym kilku rzeczy.
$4
w twoim poleceniu, uciekaj$
tak:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(czasem potrzeba więcej odwrotnych ukośników, ale jestem prawie pewien, że tutaj 1 wystarczy).exit
jest wewnętrzną powłoką i nie jestem pewien, jak potraktuje to marionetka. Zamiast tego użyj kanonicznego polecenia „powróć do sukcesu”:status => "/bin/true"
Być może
status
jest to nadpisywaneprovider => debian
(co byłoby marionetkowym błędem), więc zamiast tego podaj wszystkie polecenia i użyj podstawowego dostawcy (to jednak nie włączy się poprawnie):źródło
exec
typ, myślę, że marionetka potrzebuje pełnych ścieżek do plików wykonywalnych. Spróbuj ustawić je na pełną ścieżkę wstatus
linii, jeśli nie ustawiłeś jej globalnie?exec
Akceptujepath
parametr i możesz ustawić domyślną ścieżkę za pomocąExec { path => '/usr/bin:/bin' }
lubExec { path => ['/usr/bin'],['/bin']}
. Usługa ma podobną „ścieżkę”, ale wydaje się, że jest używana przede wszystkim u niektórych dostawców do wyszukiwania skryptów inicjujących, a nie jako zwykłą ścieżkę wyszukiwania poleceń w stylu powłoki.$4
Problemem była interpolacja . Zastąpiłem go\$4
i teraz wszystko działa zgodnie z oczekiwaniami :)