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?

provider => init(y elimine elenableparámetro).statuscomando de puppet funciona como se esperaba.Respuestas:
Mi mejor conjetura es que la
$4interpolación de la marioneta se traga lo que está en su comando y esoexit 0no funciona del todo bien debido a problemas de interacción con el shell.Intentaría algunas cosas.
$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í).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"Quizás
statusesté 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
exectipo, creo que Puppet necesita rutas completas a los ejecutables. Intente configurarlos en la ruta completa en sustatuslínea, si no ha configurado uno globalmente.execAcepta unpathpará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.$4fue el problema. Lo reemplacé\$4y ahora todo funciona como se esperaba :)