Wie kann ich mithilfe von Chef sicherstellen, dass ein Dienst ausgeführt wird?

10

Ich bin in einer Situation, in der der Küchenchef möglicherweise einen Gottesdienst startet (Postgres), der jedoch später außerhalb der Band gestoppt wird. Ich möchte, dass ein nachfolgender Chef-Lauf bewirkt, dass der Dienst ausgeführt wird. Ich habe das versucht:

service "postgresql" do
    action :start
end

Aber es hat keine Wirkung, (up to date)vermutlich weil der Chef weiß, dass es gestartet wurde und nicht sagen kann, dass es aufgehört hat. (Möglicherweise aufgrund des Verhaltens service ... statusdieses Dienstes?) Wenn ich Folgendes schreibe:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

Ich bekomme das gewünschte Verhalten. Auch ein action :restartmacht es zum Laufen. Diese scheinen jedoch aufgrund der Portabilität wie Anti-Patterns zu sein (und möglicherweise zu stoppen, bevor sie im letzteren Fall erneut gestartet werden).

Wie kann ich dem Küchenchef sagen, dass er den Dienst zwangsweise starten soll, auch wenn er denkt, dass er bereits ausgeführt wird?

Dies verwendet Chef 11.6, das von OpsCode gehostet wird, und das Standardrezept für Postgresql. (Beachten Sie, dass dies ähnlich ist, aber ich denke nicht ganz dasselbe wie Wie man Aktionen auf "aktuelle" Ressourcen in Chef erzwingt? )

--- EDIT (Klarstellung nach jtimberland post) ---

Das -l debughier zeigt:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

Auch wenn es NICHT läuft. Das klingt also nach einem Fehler, und das interessiert mich. Ich bin jedoch in erster Linie daran interessiert, ob es eine Möglichkeit gibt, Chefkoch mitzuteilen, dass "immer der Dienststartbefehl aufgerufen und die Statusprüfung übersprungen wird". Das ist hier die Frage.

(Ich bin kein Experte, aber ich denke, der portabelste Weg, um sicherzustellen, dass ein Dienst ausgeführt wird, besteht darin, den Dienst zu starten. Das ist fast immer idempotent. OTOH prüft, ob ein Dienst ausgeführt wird, ist weniger konsistent und ich verstehe nicht, warum wir uns darum kümmern sollten !)

Teilweise bewölkt
quelle

Antworten:

11

Standardmäßig überprüft Chef, ob der Dienst ausgeführt wird, und startet ihn, wenn der Dienst nicht ausgeführt wird.

Wie festgestellt wird, dass der Dienst ausgeführt wird, hängt davon ab.

Standardmäßig versucht Chef, den Namen des Dienstes ( postgresqlhier) in der Prozesstabelle mit abzugleichen ps.

ps -ef | grep postgresql

Im Wesentlichen. Der Name des Dienstes wird für die Musterübereinstimmung verwendet, wenn die Prozesstabelle überprüft wird. Dies kann oder kann nicht das sein, was Sie wollen / brauchen, insbesondere abhängig von der Plattform und wie sie den "postgresql" -Dienst benennt.

Sie können Chef jedoch mitteilen, dass der Dienst einen "Status" -Befehl unterstützt, was bedeutet, dass Chefkoch im Allgemeinen Folgendes ausführt:

/etc/init.d/postgresql status

Verwenden Sie den Rückkehrcode, um festzustellen, ob er ausgeführt wird oder nicht (Nicht-Null wird nicht ausgeführt).

Chef tut dies standardmäßig nicht, da nicht alle Service-Skripte einen Statusbefehl unterstützen (frustrierend) und Chef nicht von Natur aus weiß, was das Richtige ist. Es versucht, die vernünftige Standard-Sache zu machen, aber manchmal naiv. Auf diese Weise können Sie Chef mitteilen, dass die Ressource einen Statusbefehl hat und nicht so naiv ist.

service "postgresql" do
  supports :status => true
  action :start
end

Wenn der Dienst nicht "postgresql" heißt, sondern "postgresql-92" oder ähnliches, können Sie dies wie folgt tun:

service "postgresql-92" do
  supports :status => true
  action :start
end

oder

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

Sie können herausfinden, was detaillierter vor sich geht, indem Sie auch chef mit Debug-Ausgabe ausführen:

chef-client -l debug
jtimberman
quelle
Dies ist nützlich, beantwortet aber die Frage nicht ganz. Ich möchte es :start unabhängig von der sagen :status. Ich hoffe auch, dass es ein ps -ef | grep [p]ostgresqloder ähnliches macht, sonst passt es normalerweise zu seinem eigenen grep-Befehl und denkt daher immer, dass der Dienst ausgeführt wird. (Oder vielleicht ist das das zugrunde liegende Problem?)
Teilweise bewölkt
Es scheint mir, dass es entweder einen Fehler in Chef gibt oder dass etwas im System nicht stimmt. Welche Plattform / Plattformversion führen Sie aus? Wie haben Sie postgresql installiert? Paket, Quelle?
Jtimberman
Der Chef ergreift idempotente Maßnahmen, um Ressourcen zu verwalten, die deklarativ definiert sind. Um sicherzustellen, dass ein Dienst mit Chef ausgeführt wird, senden Sie die Startaktion an den Dienst. Wenn dies nicht der Fall ist, handelt es sich um einen Fehler in Chef, einen Fehler im Rezept oder einen Fehler im System.
Jtimberman
Danke @jtimberman. Ich habe einen Fehler für die Rückgabe eines falschen Status unter tickets.opscode.com/browse/COOK-334 geöffnet . Meine Frage hier ist jedoch, ob es eine Möglichkeit gibt, den Küchenchef zu zwingen, den Dienststartbefehl auszugeben und die Statusprüfung zu überspringen. service startist fast immer idempotent, also sollte dies in Ordnung sein.
Teilweise bewölkt
Entschuldigung, Fehler ist tickets.opscode.com/browse/COOK-3526 .
Teilweise bewölkt