¿Cómo asegurar que un servicio se esté ejecutando, utilizando Chef?

10

Estoy en una situación en la que Chef podría comenzar un servicio (postgres) pero posteriormente podría detenerse fuera de banda. Quiero que se ejecute un Chef posterior para que el servicio se ejecute. He intentado esto:

service "postgresql" do
    action :start
end

Pero no tiene ningún efecto, (up to date)presumiblemente porque Chef sabe que se ha iniciado y no puede decir que se ha detenido. (¿Posiblemente debido a cómo se service ... statuscomporta este servicio?) Si escribo esto:

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

Me sale el comportamiento deseado. También action :restarthace que funcione. Sin embargo, estos parecen ser anti-patrones debido a la portabilidad (y potencialmente detenerlo antes de comenzar de nuevo en el último caso).

Entonces, ¿cómo puedo decirle a Chef que inicie el servicio por la fuerza, incluso si cree que ya se está ejecutando?

Esto está usando Chef 11.6, alojado por OpsCode, y la receta postgresql predeterminada. (Tenga en cuenta que esto es similar, pero creo que no es lo mismo que ¿Cómo forzar acciones en recursos "actualizados" en Chef?. )

--- EDITAR (aclaración después de la publicación de jtimberland) ---

El -l debugaquí muestra:

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

Incluso cuando NO está funcionando. Eso suena como un error, y estoy interesado en eso. Sin embargo, estoy principalmente interesado en saber si hay una manera de decirle al Chef "siempre invoque el comando de inicio del servicio, omitiendo la verificación de estado". Esa es la pregunta aquí.

(No soy un experto, pero creo que la forma más portátil de garantizar que un servicio se esté ejecutando es iniciar el servicio y eso casi siempre es idempotente. OTOH comprobar si un servicio se está ejecutando es menos coherente y no veo por qué debería importarnos !)

Parcialmente nublado
fuente

Respuestas:

11

De manera predeterminada, Chef verificará si el servicio se está ejecutando y lo iniciará si el servicio no se está ejecutando.

Cómo determina que el servicio se está ejecutando depende.

De forma predeterminada, Chef intentará hacer coincidir el nombre del servicio ( postgresqlaquí) en la tabla de proceso utilizando ps.

ps -ef | grep postgresql

Esencialmente. El nombre del servicio se utilizará para la coincidencia de patrones al inspeccionar la tabla de procesos. Esto puede o no ser lo que desea / necesita, especialmente dependiendo de la plataforma y de cómo nombra el servicio "postgresql".

Sin embargo, puede decirle a Chef que el servicio admite un comando de "estado", lo que significa que Chef generalmente hará algo como,

/etc/init.d/postgresql status

Y use el código de retorno para determinar si se está ejecutando o no (no es cero).

Chef no hace esto de manera predeterminada porque no todos los scripts de servicio admiten un comando de estado (frustrantemente), y Chef no sabe de manera innata qué es lo correcto. Intenta hacer lo correcto por defecto, pero a veces ingenuo. Por lo tanto, puede decirle a Chef que el recurso tiene un comando de estado y que no es tan ingenuo.

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

Ahora, si el servicio en realidad no se llama "postgresql" sino que es "postgresql-92" o similar, puede hacer esto como:

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

o

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

Puede averiguar qué está sucediendo con más detalle ejecutando chef con salida de depuración, también:

chef-client -l debug
jtimberman
fuente
Esto es útil pero no responde la pregunta. Quiero decirlo :start independientemente de la :status. También espero que haga una ps -ef | grep [p]ostgresqlo similar, de lo contrario, generalmente coincidirá con su propio comando grep y, por lo tanto, siempre pensará que el servicio se está ejecutando. (¿O tal vez ese es el problema subyacente?)
Parcialmente nublado
Me parece que hay un error en Chef o algo está mal en el sistema. ¿Qué plataforma / versión_plataforma estás ejecutando? ¿Cómo instalaste postgresql? Paquete, fuente?
jtimberman
Para lograrlo, Chef toma medidas idempotentes para administrar los recursos que se definen de manera declarativa. La forma en que se asegura de que un servicio se esté ejecutando con Chef es enviar la acción de inicio al servicio. Si eso no ocurre, es un error en Chef, un error en la receta o un error en el sistema.
jtimberman
Gracias @ jtimberman. He abierto un error por el estado incorrecto que se devuelve en tickets.opscode.com/browse/COOK-334 . Sin embargo, mi pregunta aquí es si hay una manera de obligar al chef a emitir el comando service-start, omitiendo la verificación del estado. service startcasi siempre es idempotente, así que esto debería estar bien.
Parcialmente nublado
Lo sentimos, el error es tickets.opscode.com/browse/COOK-3526 .
Parcialmente nublado