Comment s'assurer qu'un service fonctionne, en utilisant Chef?

10

Je suis dans une situation où Chef pourrait démarrer un service (postgres) mais il pourrait par la suite être arrêté hors bande. Je souhaite qu'une exécution ultérieure de Chef entraîne l'exécution du service. J'ai essayé ceci:

service "postgresql" do
    action :start
end

Mais cela n'a aucun effet, disant (up to date)probablement parce que le chef sait qu'il a été démarré et n'est pas en mesure de dire qu'il s'est arrêté. (Peut-être en raison du service ... statuscomportement de ce service?) Si j'écris ceci:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

J'obtiens le comportement souhaité. Aussi, action :restartil fonctionne. Cependant, ceux-ci semblent être anti-modèles en raison de la portabilité (et potentiellement l'arrêter avant de le redémarrer dans ce dernier cas).

Alors, comment puis-je dire à Chef de démarrer le service de force, même s'il pense qu'il est déjà en cours d'exécution?

Ceci utilise Chef 11.6, hébergé par OpsCode, et la recette postgresql par défaut. (Notez que c'est similaire mais je ne pense pas tout à fait comme Comment forcer des actions sur des ressources "à jour" dans Chef?. )

--- EDIT (clarification après la publication de jtimberland) ---

Le -l debugici montre:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

Même lorsqu'il ne fonctionne PAS. Cela ressemble donc à un bug, et ça m'intéresse. Cependant, je suis principalement intéressé à savoir s'il existe un moyen de dire à Chef "toujours appeler la commande de démarrage du service, en sautant la vérification d'état". Voilà la question ici.

(Je ne suis pas un expert, mais je pense que la façon la plus portable de s'assurer qu'un service fonctionne est de démarrer le service et c'est presque toujours idempotent. OTOH vérifier si un service est en cours d'exécution est moins cohérent et je ne vois pas pourquoi nous devrions nous en soucier !)

Partiellement nuageux
la source

Réponses:

11

Par défaut, Chef vérifie si le service est en cours d'exécution et le démarre si le service n'est pas en cours d'exécution.

La façon dont il détermine que le service s'exécute dépend.

Par défaut, Chef tentera de faire correspondre le nom du service ( postgresqlici) dans la table de processus à l'aide de ps.

ps -ef | grep postgresql

Essentiellement. Le nom du service sera utilisé pour la correspondance de modèle lors de l'inspection de la table de processus. Cela peut ou non être ce que vous voulez / besoin, en particulier en fonction de la plate-forme et de la façon dont elle nomme le service "postgresql".

Cependant, vous pouvez dire à Chef que le service prend en charge une commande "status", ce qui signifie que Chef fera généralement quelque chose comme,

/etc/init.d/postgresql status

Et utilisez le code retour pour déterminer s'il fonctionne ou non (non nul n'est pas en cours d'exécution).

Chef ne le fait pas par défaut, car tous les scripts de service ne prennent pas en charge une commande d'état (de manière frustrante), et Chef ne sait pas naturellement quelle est la bonne chose à faire. Il essaie de faire la chose sensée par défaut, mais parfois naïf. Ainsi, vous pouvez dire à Chef que la ressource a une commande de statut et ne pas être aussi naïf.

service "postgresql" do
  supports :status => true
  action :start
end

Maintenant, si le service n'est pas réellement nommé "postgresql" mais est plutôt "postgresql-92" ou similaire, vous pouvez le faire comme suit:

service "postgresql-92" do
  supports :status => true
  action :start
end

ou

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

Vous pouvez découvrir ce qui se passe plus en détail en exécutant chef avec une sortie de débogage:

chef-client -l debug
jtimberman
la source
Ceci est utile mais ne répond pas tout à fait à la question. Je veux le dire :start indépendamment de la :status. J'espère également qu'il fait un ps -ef | grep [p]ostgresqlou similaire, sinon il correspondra généralement à sa propre commande grep et pense donc toujours que le service est en cours d'exécution. (Ou c'est peut-être le problème sous-jacent?)
Partiellement nuageux
Il me semble qu'il y a soit un bug dans Chef, soit quelque chose ne va pas sur le système. Quelle plateforme / version_plateforme utilisez-vous? Comment avez-vous installé postgresql? Paquet, source?
jtimberman
Pour cela, Chef prend des mesures idempotentes pour gérer les ressources définies de manière déclarative. La façon dont vous vous assurez qu'un service s'exécute avec Chef consiste à envoyer l'action de démarrage au service. Si cela ne se produit pas, c'est un bogue dans Chef, un bogue dans la recette ou un bogue sur le système.
jtimberman
Merci @jtimberman. J'ai ouvert un bogue pour un mauvais statut renvoyé sur tickets.opscode.com/browse/COOK-334 . Cependant, ma question ici est de savoir s'il existe un moyen de forcer le chef à émettre la commande de démarrage du service, en ignorant la vérification de l'état. service startest presque toujours idempotent donc ça devrait aller.
Partiellement nuageux
Désolé, le bogue est tickets.opscode.com/browse/COOK-3526 .
Partiellement nuageux