Come garantire che un servizio sia in esecuzione, utilizzando Chef?


10

Sono in una situazione in cui Chef potrebbe avviare un servizio (postgres) ma potrebbe successivamente essere interrotto fuori banda. Voglio una successiva corsa dello Chef per far funzionare il servizio. Ho provato questo:

service "postgresql" do
    action :start
end

Ma non ha alcun effetto, dicendo (up to date)presumibilmente perché Chef sa che è stato avviato e non è in grado di dire che si è fermato. (Forse a causa di come service ... statussi comporta per questo servizio?) Se scrivo questo:

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

Ottengo il comportamento desiderato. Inoltre action :restartlo fa funzionare. Tuttavia, questi sembrano anti-pattern a causa della portabilità (e potenzialmente lo fermano prima di riavviarlo in quest'ultimo caso).

Quindi, come posso dire a Chef di avviare forzatamente il servizio, anche se pensa che sia già in esecuzione?

Questo utilizza Chef 11.6, ospitato da OpsCode e la ricetta postgresql predefinita. (Si noti che questo è simile ma penso che non sia esattamente lo stesso di Come forzare azioni su risorse "aggiornate" in Chef? )

--- MODIFICA (chiarimento dopo post jtimberland) ---

Il -l debugqui mostra:

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

Anche quando NON è in esecuzione. Quindi sembra un bug, e mi interessa. Tuttavia sono principalmente interessato a sapere se esiste un modo per dire a Chef "invoca sempre il comando di avvio del servizio, saltando il controllo dello stato". Questa è la domanda qui.

(Non sono un esperto, ma penso che il modo più portatile per garantire che un servizio sia in esecuzione è quello di avviare il servizio e questo è quasi sempre idempotente. OTOH verifica se un servizio è in esecuzione è meno coerente e non vedo perché dovremmo preoccuparci !)

Risposte:


11

Per impostazione predefinita, Chef controlla se il servizio è in esecuzione e lo avvia se il servizio non è in esecuzione.

Come determina che il servizio è in esecuzione dipende.

Per impostazione predefinita, Chef tenterà di far corrispondere il nome del servizio ( postgresqlqui) nella tabella dei processi utilizzando ps.

ps -ef | grep postgresql

Essenzialmente. Il nome del servizio verrà utilizzato per la corrispondenza del modello durante l'ispezione della tabella dei processi. Questo potrebbe essere o meno ciò che desideri / hai bisogno, specialmente in base alla piattaforma e al modo in cui nomina il servizio "postgresql".

Tuttavia, puoi dire a Chef che il servizio supporta un comando "status", il che significa che generalmente Chef farà qualcosa del tipo,

/etc/init.d/postgresql status

E usa il codice di ritorno per determinare se è in esecuzione o meno (diverso da zero non è in esecuzione).

Chef non lo fa per impostazione predefinita perché non tutti gli script di servizio supportano un comando di stato (frustrante) e Chef non sa bene quale sia la cosa giusta da fare. Cerca di fare la cosa sana di default, ma a volte ingenua. Quindi, puoi dire a Chef che la risorsa ha un comando status e non essere così ingenua.

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

Ora, se il servizio non è in realtà chiamato "postgresql" ma è invece "postgresql-92" o simile, puoi farlo come:

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

o

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

Puoi scoprire cosa sta succedendo in modo più dettagliato eseguendo anche chef con output di debug:

chef-client -l debug

Questo è utile ma non risponde alla domanda. Voglio dirlo a :start prescindere dal :status. Spero anche che faccia un ps -ef | grep [p]ostgresqlo simile, altrimenti corrisponderà di solito al suo comando grep e quindi penso sempre che il servizio sia in esecuzione. (O forse è questo il problema di fondo?)
Parzialmente nuvoloso,

Mi sembra che ci sia un bug in Chef o che qualcosa non vada nel sistema. Quale piattaforma / platform_version stai eseguendo? Come hai installato postgresql? Pacchetto, fonte?
jtimberman,

Per Pentecoste, Chef intraprende azioni idempotenti per gestire le risorse che sono definite in modo dichiarativo. Il modo in cui si garantisce che un servizio sia in esecuzione con Chef è inviare l'azione di avvio al servizio. Se ciò non accade, si tratta di un bug in Chef, un bug nella ricetta o un bug nel sistema.
jtimberman,

Grazie @jtimberman. Ho aperto un bug per la restituzione di uno stato errato su tickets.opscode.com/browse/COOK-334 . Tuttavia la mia domanda qui è se c'è un modo per forzare lo chef a emettere il comando di avvio del servizio, saltando il controllo dello stato. service startè quasi sempre idempotente, quindi dovrebbe andare bene.
Parzialmente nuvoloso,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.