/ / Comment capturer les exceptions de chef - rubis, chef, chef-recette

Comment capturer des exceptions de chef - ruby, chef, recette de chef

Je travaille actuellement sur une recette de Chef et je dois mettre à jour un sac de données avec certaines informations en fonction du résultat du code. En gros, je dois mettre à jour un sac de données avec succès ou échec.

Le code ressemble à ceci:

begin
node[:fileDeploy].each do |f|
if f[:deploy]
cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do
owner users["tomcatUser"]
group users["tomcatGroup"]
mode "0755"
cookbook node[:cookbookName]
source "#{f[:sourceFilename]}"
end
end
end
# Update data bag: succeeded
rescue Chef::Exceptions::FileNotFound => e
# Update data bag: failed
end

Le problème est que même s’il existe unfichier manquant, le bloc de secours n'est pas exécuté et le sac de données n'est pas mis à jour en conséquence. Donc, quand j'exécute la commande sudo chef-client sur le serveur, elle se termine avec l'exception Chef::Exceptions::FileNotFound mais il n'est pas géré par le rescue bloc. Est-ce que ça fait du sens? De l'aide?

Réponses:

4 pour la réponse № 1

Votre bloc de secours ne détecte pas l'exception car le code qui lève l'exception n'est pas exécuté dans l'étendue du gestionnaire d'exceptions.

Dans votre code, vous déclarez un cookbook_file Ressource. La déclaration se passe bien et l'exécution de la ressource est planifiée pendant la phase de convergence. Votre bloc de secours pourrait intercepter une exception qui se produirait lors de la déclaration de la ressource, et non lors de son exécution.

S'il te plait regarde À propos de la course chef-client pour en savoir plus sur les deux phases d’un chef cuisinier, à savoir la génération de la collection de ressources et la convergence ultérieure.

Maintenant, pour le résultat souhaité, vous pouvez vérifier la condition selon laquelle le fichier source existe lors de la convergence et décider en conséquence.

Généralement, les erreurs de traitement sont plutôt difficiles dans Chef. C’est par conception, comme vous devriez normalement concevoir votre système, qu’il est plutôt indépendant des autres composants. Donc, si vous avez besoin d’un répertoire ou d’un fichier, vous devez le créer explicitement en utilisant la ressource appropriée. Vous pouvez alors utiliser notifications pour notifier aux autres ressources d'exécuter une certaine action si la ressource actuelle est "modifiée" (quelle que soit la signification de cette ressource)

Le code ci-dessous tente d'obtenir quelque chose de similaireà ce que vous voulez apparemment. Il ne détecte toujours pas une exception lors de la convergence, mais essaie de ne pas en créer une en premier lieu, mais vérifie les conditions requises et exécute les ressources appropriées.

node[:fileDeploy].each do |f|
if f[:deploy]
cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do
owner users["tomcatUser"]
group users["tomcatGroup"]
mode "0755"
cookbook node[:cookbookName]
source f[:sourceFilename]
only_if{ Dir.exist?(File.base_name(f[:sourceFilename]) }
notifies :run, "execute[success #{f[:sourceFilename]}]", :immediately
end

# This one gets notified (and run) when the cookbook_file is successful
execute "success #{f[:sourceFilename]}" do
action :nothing
command "do whatever you like"
end

# This one runs only if f[:sourceFilename] doesn"t exist by now
execute "error #{f[:sourceFilename]}" do
action :run
command "do whatever you like"
creates f[:sourceFilename]
end
end
end