Comment vérifier si un dossier existe dans Chef?
C'est mon code:
if !::File.exist?("#{node['iis']['home']}\\backup\\BkpB4Chef")
windows_batch "Backup IIS Config" do
code <<-EOH
"#{node['iis']['home']}"\\appcmd add backup BkpB4Chef
EOH
end
end
Il dit toujours que le fichier existe et s'exécute la boucle.
source d'informationauteur Sony Koithara | 2013-08-22
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser Le Chef des gardes ici. Les gardes de spécifier l'exécution conditionnelle, mais encore insérer la ressource dans la collection de ressources. Dans votre exemple, et jtblin réponse, la ressource n'est jamais ajouté à la collection (que je vais expliquer un peu plus loin dans un instant).
Voici une partie du code qui fonctionne pour vous aider à démarrer:
À l'aide de
creates
Beaucoup de non-idempotent Chef des ressources également le support d'un
creates
paramètre, ce qui explique que la ressource n'est. En d'autres termes, quel est lewindows_batch
"créer". Ce peut être un fichier, un répertoire ou un fichier exécutable. Ainsi, le code suivant est équivalent à l'ancien réponse.Pourquoi
not_if
vs le conditionnel wrapperChef exécute en deux phases - la phase de compilation et de la phase de convergence. Au cours de la phase de compilation, les recettes sont evaled et les ressources sont ajoutées à la collection de ressources. Dans la phase de convergence, les ressources de la collection de ressources sont exécutées et évaluées contre le système cible. Donc, considérons l'exemple suivant:
C'est un assez simple recette qui commence à un service basé sur conditionnelle. Cependant, à la fin de la phase de compilation, le
service
ressource n'est pas ajouté à la collection de ressources. Depuis la recette DSL estinstance_eval
ed, de l'emballageif false
conditionnelle empêche que le code de jamais être lu par le Rubis de la VM. En d'autres termes, c'est comme ce service n'existe jamais.Il est assez fréquent de notifier des ressources. Plus tard dans la recette, vous voudrez peut-être redémarrer apache en raison d'un changement de configuration. La "bonne" manière de faire ceci est d'utiliser les notifications:
Ce
template
ne peut en aviser le service des ressources, car il n'existe pas dans la collection de ressources. Donc cette recette sera un échec. Il semble comme un exemple trivial, mais si vous modifiez le conditionnelif false
à un nœud attribut de test:vous avez créé une dichotomie dans votre livre de recettes où il va travailler à 50% du temps. Malheureusement, la plupart des livres de cuisine sont beaucoup plus complexes que deux ressources, de sorte que le nombre de cas où une ressource peut notifier inexistante de ressources augmente considérablement la complexité. Tout ceci est résoluble (et d'expositions, le comportement correct) à l'aide de ressources gardes:
Utilisation
Dir.exists?
. Vous pouvez également remplacerif ! condition
parunless condition
qui se lit un peu mieux.