Ich verwende Debian Squeeze mit PostgreSQL 9.1 aus Backports. Puppet hat Version 2.7.14. Leider gibt das Init-Skript den falschen Exit-Code für den Status zurück. Daher habe ich einen benutzerdefinierten status
Befehl geschrieben, um festzustellen, ob postgresql ausgeführt wird oder nicht.
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,
}
Mein Befehl funktioniert wie ein Charme, aber die Puppe scheint ein Problem zu haben. Ich bekomme immer, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'
obwohl es schon läuft.
Also versuchte folgendes:
service { 'postgresql':
ensure => running,
enable => true,
hasstatus => false,
hasrestart => true,
status => "exit 0",
provider => debian,
}
Wie ich diesen benutzerdefinierten status
Befehl verstanden habe , sollte Puppet immer denken, dass postgresql ausgeführt wird. Trotzdem versucht Puppe jedes Mal postgresql zu starten.
Was ist meine Schuld? Oder ist es ein Fehler in der Marionette?
provider => init
(und entfernen Sie denenable
Parameter).status
funktioniert der Befehl der Puppe wie erwartet!Antworten:
Meine besten Vermutungen sind, dass das
$4
in Ihrem Befehl befindliche Element durch die Interpolation der Puppe verschluckt wird und dassexit 0
dies aufgrund von Problemen mit der Shell-Interaktion nicht ganz richtig funktioniert.Ich würde ein paar Dinge ausprobieren.
$4
in Ihrem Befehl ist, entkommen Sie$
wie folgt :status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(Manchmal sind mehr Backslashes erforderlich, aber ich bin mir ziemlich sicher, dass 1 hier ausreicht).exit
ist eine Shell intern und ich bin nicht sicher, wie Marionette das behandeln wird. Verwenden Sie stattdessen den kanonischen Befehl "Erfolg zurückgeben":status => "/bin/true"
Möglicherweise
status
wird es überschrieben vonprovider => debian
(was ein Marionettenfehler wäre). Geben Sie stattdessen alle Befehle an und verwenden Sie den Basisanbieter (dies wird jedoch nicht ordnungsgemäß aktiviert):quelle
exec
Typ denke ich, dass Puppet vollständige Pfade zu ausführbaren Dateien benötigt. Versuchen Sie, diese auf den vollständigen Pfad in Ihrerstatus
Zeile festzulegen , wenn Sie keinen global festgelegt haben.exec
einpath
Parameter und Sie können einen Standardpfad mitExec { path => '/usr/bin:/bin' }
oder festlegenExec { path => ['/usr/bin'],['/bin']}
. Es gibt einen ähnlichen "Pfad" für den Dienst, der jedoch anscheinend hauptsächlich von bestimmten Anbietern zum Suchen von Init-Skripten verwendet wird und nicht als normaler Befehlssuchpfad im Shell-Stil.$4
war das Problem. Ich habe es durch ersetzt\$4
und jetzt funktioniert alles wie erwartet :)