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 status
comando 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 status
comando 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?
provider => init
(y elimine elenable
parámetro).status
comando de puppet funciona como se esperaba.Respuestas:
Mi mejor conjetura es que la
$4
interpolación de la marioneta se traga lo que está en su comando y esoexit 0
no funciona del todo bien debido a problemas de interacción con el shell.Intentaría algunas cosas.
$4
en 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í).exit
es 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"
Quizás
status
esté siendo anulado porprovider => 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):fuente
exec
tipo, creo que Puppet necesita rutas completas a los ejecutables. Intente configurarlos en la ruta completa en sustatus
línea, si no ha configurado uno globalmente.exec
Acepta unpath
parámetro y puede establecer una ruta predeterminada conExec { path => '/usr/bin:/bin' }
oExec { 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.$4
fue el problema. Lo reemplacé\$4
y ahora todo funciona como se esperaba :)