Wie verwende ich einen benutzerdefinierten Statusbefehl für einen Dienst in Puppet?

10

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 statusBefehl 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 statusBefehl 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?

Mehr
quelle
Ihr Manifest sieht korrekt aus, daher klingt dies wie ein Fehler in Puppet. Es ist ein langer Weg, aber versuchen Sie es mit der Einstellung provider => init(und entfernen Sie den enableParameter).
mgorven
2
Sind Sie sicher, dass Exit 0 ein gültiger Befehl ist? Der Befehl exit ist normalerweise in einer Shell enthalten. Müssen Sie so etwas wie bash -c 'exit 0' machen?
Zoredache
@Zoredache du hast recht. Mit sh -c 'exit 0' statusfunktioniert der Befehl der Puppe wie erwartet!
Mehr

Antworten:

6

Meine besten Vermutungen sind, dass das $4in Ihrem Befehl befindliche Element durch die Interpolation der Puppe verschluckt wird und dass exit 0dies aufgrund von Problemen mit der Shell-Interaktion nicht ganz richtig funktioniert.

Ich würde ein paar Dinge ausprobieren.

  1. Wenn das Problem die Interpolation der Puppe $4in 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).
  2. Stellen Sie sicher, dass der Testbefehl wirklich richtig funktioniert. exitist 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"
  3. Möglicherweise statuswird es überschrieben von provider => debian(was ein Marionettenfehler wäre). Geben Sie stattdessen alle Befehle an und verwenden Sie den Basisanbieter (dies wird jedoch nicht ordnungsgemäß aktiviert):

    service { 'postgresql':
      provider => base,
      ensure   => 'running',
      start    => '/etc/init.d/postgresql start',
      restart  => '/etc/init.d/postgresql restart',
      stop     => '/etc/init.d/postgresql stop',
      status   => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'",
    }
    
freiheit
quelle
Eine andere Sache: Ähnlich wie beim execTyp denke ich, dass Puppet vollständige Pfade zu ausführbaren Dateien benötigt. Versuchen Sie, diese auf den vollständigen Pfad in Ihrer statusZeile festzulegen , wenn Sie keinen global festgelegt haben.
Shane Madden
@ShaneMadden: Puppet benötigt nicht unbedingt vollständige Pfade zu Befehlen, obwohl die Annahme, dass sie benötigt werden, nichts verletzt. Zusätzlich zu einer Art Standardpfad (PATH im Umgebungsdämon wurde in gestartet?) Akzeptiert execein pathParameter und Sie können einen Standardpfad mit Exec { path => '/usr/bin:/bin' }oder festlegen Exec { 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.
Freiheit
1
Vielen Dank! Die Interpolation von $4war das Problem. Ich habe es durch ersetzt \$4und jetzt funktioniert alles wie erwartet :)
MMore