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

10

Estou usando o debian squeeze com o PostgreSQL 9.1 de backports. O fantoche tem a versão 2.7.14. Infelizmente, o script de inicialização retorna o código de saída incorreto para status. Por isso, escrevi um comando status 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 charme, 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 este comando customizado status , o fantoche deve sempre pensar que o postgresql está rodando. No entanto, o fantoche tenta iniciar o postgresql - todas as vezes.

O que é minha culpa? Ou é um bug no fantoche?

    
por MMore 15.05.2012 / 19:59

1 resposta

6

Meus melhores palpites são que $4 em seu comando está sendo engolido pela própria interpolação dos fantoches e que exit 0 não funciona bem devido a problemas de interação com o shell.

Eu tentaria algumas coisas.

  1. Se o problema for a interpolação de fantoches em $4 em seu comando, escape do $ assim: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\ != \"online\") rc=3} END { exit rc }'" (às vezes, barras invertidas são necessárias, mas tenho certeza de que 1 é o suficiente aqui).
  2. Verifique se o comando de teste está realmente funcionando corretamente. exit é um shell interno e não tenho certeza de como o fantoche tratará disso. Portanto, use o comando canônico "return success": status => "/bin/true"
  3. Talvez status esteja sendo substituído por provider => debian (o que seria um erro de fantoche), então especifique todos os comandos e use o provedor de base (isso não será habilitado corretamente, no entanto):

    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 (\ != \"online\") rc=3} END { exit rc }'",
    }
    
por 15.05.2012 / 22:20