Como usar um comando de status personalizado para um serviço no fantoche?

10

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 statuscomando 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 statuscomando 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?

MMore
fonte
Seu manifesto parece correto, então isso soa como um bug no Puppet. É um tiro no escuro, mas tente configurar provider => init(e remova o enableparâmetro).
mgorven 15/05
2
Tem certeza de que a saída 0 é um comando válido? O comando exit é geralmente interno a um shell. Você precisa fazer algo como bash -c 'exit 0'?
Zoredache
@ Zoredache você está certo. Com sh -c 'exit 0', o statuscomando do fantoche funciona como esperado!
mmore

Respostas:

6

Meu palpite é que o $4comando está sendo engolido pela interpolação do boneco e isso exit 0não funciona direito devido a problemas de interação do shell.

Eu tentaria algumas coisas.

  1. Se o problema é a interpolação de marionetes $4no 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).
  2. Verifique se o comando test está realmente funcionando corretamente. 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"
  3. Talvez statusesteja sendo substituído por provider => 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):

    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
fonte
Outra coisa: semelhante ao exectipo, acho que o fantoche precisa de caminhos completos para os executáveis. Tente configurá-los para o caminho completo da sua statuslinha, se você não tiver definido um globalmente?
Shane Madden
@ShaneMadden: O Puppet não precisa necessariamente de caminhos completos para os comandos, embora supor que precise deles não prejudique nada. Além de algum tipo de caminho padrão (PATH no daemon de ambiente foi iniciado em?) execAceita um pathparâmetro e você pode definir um caminho padrão com Exec { path => '/usr/bin:/bin' }ou Exec { 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.
002 freiheit #
1
Obrigado! A interpolação de $4foi o problema. Eu substituí-lo com \$4e agora tudo funciona como esperado :)
mmore