¿Cómo usar un comando de estado personalizado para un servicio en Puppet?

10

Estoy usando Debian Squeeze con PostgreSQL 9.1 desde backports. Puppet tiene la versión 2.7.14. Desafortunadamente, el script de inicio devuelve el código de salida incorrecto para el estado. Por lo tanto, escribí un statuscomando personalizado para detectar si postgresql se está ejecutando o no.

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,
}

Mi comando funciona como un encanto, pero la marioneta parece tener un problema. Siempre me sale notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'aunque ya se está ejecutando.

Entonces intenté lo siguiente:

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "exit 0",
  provider => debian,
}

Como entendí este statuscomando personalizado , Puppet siempre debería pensar que postgresql se está ejecutando. Sin embargo, Puppet intenta iniciar postgresql, siempre.

¿Qué es mi culpa? ¿O es un error en la marioneta?

MMás
fuente
Su manifiesto se ve correcto, por lo que esto suena como un error en Puppet. Es una posibilidad remota, pero intente configurar provider => init(y elimine el enableparámetro).
mgorven
2
¿Estás seguro de que la salida 0 es un comando válido? El comando de salida suele ser interno a un shell. ¿Necesitas hacer algo como bash -c 'exit 0'?
Zoredache
@ Zoredache tienes razón. Con sh -c 'exit 0', el statuscomando de puppet funciona como se esperaba.
MMore

Respuestas:

6

Mi mejor conjetura es que la $4interpolación de la marioneta se traga lo que está en su comando y eso exit 0no funciona del todo bien debido a problemas de interacción con el shell.

Intentaría algunas cosas.

  1. Si el problema es la interpolación de la marioneta $4en su comando, escape de la siguiente $manera: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(a veces se requieren más barras invertidas, pero estoy bastante seguro de que 1 es suficiente aquí).
  2. Asegúrese de que el comando de prueba realmente funcione correctamente. exites un shell interno y no estoy seguro de cómo títere tratará eso. Así que use el comando canónico "return success" en su lugar:status => "/bin/true"
  3. Quizás statusesté siendo anulado por provider => debian(que sería un error de títere), por lo tanto, especifique todos los comandos y use el proveedor base (sin embargo, esto no se habilitará correctamente):

    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
fuente
Otra cosa: similar al exectipo, creo que Puppet necesita rutas completas a los ejecutables. Intente configurarlos en la ruta completa en su statuslínea, si no ha configurado uno globalmente.
Shane Madden
@ShaneMadden: Puppet no necesariamente necesita rutas completas para los comandos, aunque asumir que los necesita no hace daño a nada. Además de algún tipo de ruta predeterminada (¿PATH en el entorno en el que se inició el demonio?) execAcepta un pathparámetro y puede establecer una ruta predeterminada con Exec { path => '/usr/bin:/bin' }o Exec { path => ['/usr/bin'],['/bin']}. Hay una 'ruta' similar en el Servicio, pero parece que se usa principalmente con ciertos proveedores para encontrar scripts de inicio, en lugar de como una ruta de búsqueda de comando de estilo shell normal.
Freiheit
1
¡Gracias! La interpolación de $4fue el problema. Lo reemplacé \$4y ahora todo funciona como se esperaba :)
Más