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 status
commande 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 status
commande 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?
provider => init
(et supprimez leenable
paramètre).status
commande de marionnette fonctionne comme prévu!Réponses:
Mes meilleures suppositions sont que le
$4
dans votre commande est englouti par la propre interpolation de la marionnette et celaexit 0
ne fonctionne pas tout à fait en raison de problèmes d'interaction avec le shell.J'essaierais quelques choses.
$4
dans 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).exit
est 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"
Peut
status
- être est remplacé parprovider => 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):la source
exec
type, je pense que la marionnette a besoin de chemins complets vers les exécutables. Essayez de les définir sur le chemin complet de votrestatus
ligne, si vous n'en avez pas défini un globalement?exec
Accepte unpath
paramètre et vous pouvez définir un chemin par défaut avecExec { path => '/usr/bin:/bin' }
ouExec { 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.$4
était le problème. Je l'ai remplacé par\$4
et maintenant tout fonctionne comme prévu :)