Estou usando o debian squeeze com o PostgreSQL 9.1 a partir de backports. O Puppet possui a versão 2.7.14. Infelizmente, o script init retorna o código de saída errado para o status. Portanto, escrevi um status
comando personalizado para detectar se o postgresql está sendo executado ou não.
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,
}
Meu comando funciona como um encanto, mas o fantoche parece ter um problema. Eu sempre recebo, notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'
embora já esteja em execução.
Então tentei o seguinte:
service { 'postgresql':
ensure => running,
enable => true,
hasstatus => false,
hasrestart => true,
status => "exit 0",
provider => debian,
}
Como eu entendi esse status
comando personalizado , o puppet deve sempre pensar que o postgresql está em execução. No entanto, o fantoche tenta iniciar o postgresql - sempre.
Qual é a minha culpa? Ou é um bug no boneco?
provider => init
(e remova oenable
parâmetro).status
comando do fantoche funciona como esperado!Respostas:
Meu palpite é que o
$4
comando está sendo engolido pela interpolação do boneco e issoexit 0
não funciona direito devido a problemas de interação do shell.Eu tentaria algumas coisas.
$4
no seu comando, escape$
assim:status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"
(às vezes são necessárias mais barras invertidas, mas tenho certeza de que 1 é suficiente aqui).exit
é uma concha interna e não tenho certeza de como a marionete tratará isso. Portanto, use o comando canônico "return success":status => "/bin/true"
Talvez
status
esteja sendo substituído porprovider => debian
(o que seria um erro de fantoche), portanto, especifique todos os comandos e use o provedor base (no entanto, isso não será ativado corretamente):fonte
exec
tipo, acho que o fantoche precisa de caminhos completos para os executáveis. Tente configurá-los para o caminho completo da suastatus
linha, se você não tiver definido um globalmente?exec
Aceita umpath
parâmetro e você pode definir um caminho padrão comExec { path => '/usr/bin:/bin' }
ouExec { path => ['/usr/bin'],['/bin']}
. Existe um 'caminho' semelhante no Serviço, mas parece ser usado principalmente com certos provedores para encontrar scripts init, e não como um caminho normal de pesquisa de comandos no estilo de shell.$4
foi o problema. Eu substituí-lo com\$4
e agora tudo funciona como esperado :)