Comment utiliser une commande de statut personnalisé pour un service en marionnette?

10

J'utilise debian squeeze avec PostgreSQL 9.1 depuis les backports. Puppet a la version 2.7.14. Malheureusement, le script init renvoie le mauvais code de sortie pour le statut. J'ai donc écrit une statuscommande personnalisée pour détecter si postgresql est en cours d'exécution ou non.

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,
}

Ma commande fonctionne comme un charme, mais la marionnette semble avoir un problème. Je reçois toujours notice: /Stage[main]/Postgresql/Service[postgresql]/ensure: ensure changed 'stopped' to 'running'bien qu'il fonctionne déjà.

J'ai donc essayé ce qui suit:

service { 'postgresql':
  ensure => running,
  enable => true,
  hasstatus  => false,
  hasrestart => true,
  status => "exit 0",
  provider => debian,
}

Si j'ai bien compris cette statuscommande personnalisée , la marionnette doit toujours penser que postgresql est en cours d'exécution. Néanmoins, la marionnette essaie de démarrer postgresql - à chaque fois.

Quelle est ma faute? Ou est-ce un bug dans la marionnette?

MMore
la source
Votre manifeste semble correct, donc cela ressemble à un bogue dans Puppet. C'est un long plan, mais essayez de régler provider => init(et supprimez le enableparamètre).
mgorven
2
Êtes-vous sûr que l'exit 0 est une commande valide? La commande exit est généralement interne à un shell. Avez-vous besoin de faire quelque chose comme bash -c 'exit 0'?
Zoredache
@Zoredache vous avez raison. Avec sh -c 'exit 0' la statuscommande de marionnette fonctionne comme prévu!
MMore

Réponses:

6

Mes meilleures suppositions sont que le $4dans votre commande est englouti par la propre interpolation de la marionnette et cela exit 0ne fonctionne pas tout à fait en raison de problèmes d'interaction avec le shell.

J'essaierais quelques choses.

  1. Si le problème est l'interpolation des marionnettes $4dans votre commande, échappez $à ceci: status => "pg_lsclusters -h | awk 'BEGIN {rc=0} {if (\$4 != \"online\") rc=3} END { exit rc }'"(parfois plus de barres obliques inverses sont nécessaires, mais je suis sûr que 1 suffit ici).
  2. Assurez-vous que la commande de test fonctionne vraiment correctement. exitest une coquille interne et je ne sais pas comment la marionnette traitera cela. Utilisez donc la commande canonique "return success" à la place:status => "/bin/true"
  3. Peut status- être est remplacé par provider => debian(ce qui serait un bogue de marionnette), alors spécifiez plutôt toutes les commandes et utilisez le fournisseur de base (cela ne s'activera pas correctement, cependant):

    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
la source
Une autre chose: similaire au exectype, je pense que la marionnette a besoin de chemins complets vers les exécutables. Essayez de les définir sur le chemin complet de votre statusligne, si vous n'en avez pas défini un globalement?
Shane Madden
@ShaneMadden: Puppet n'a pas nécessairement besoin de chemins d'accès complets aux commandes, bien que supposer qu'il en ait besoin ne fait rien de mal. En plus d'une sorte de chemin par défaut (PATH dans le démon d'environnement a été démarré en?) execAccepte un pathparamètre et vous pouvez définir un chemin par défaut avec Exec { path => '/usr/bin:/bin' }ou Exec { path => ['/usr/bin'],['/bin']}. Il existe un `` chemin '' similaire sur Service, mais il semble être principalement utilisé avec certains fournisseurs pour trouver des scripts d'initialisation, plutôt que comme chemin de recherche de commandes de style shell normal.
freiheit
1
Merci! L'interpolation de $4était le problème. Je l'ai remplacé par \$4et maintenant tout fonctionne comme prévu :)
MMore