Disons que j'ai du code Chef comme:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Où /bin/somecommand
n'existe pas encore car il est installé par somepackage
. Cela échouera au moment de la compilation de la recette pour cette raison, mais fonctionnera évidemment au moment de la convergence si le package s'installe avec succès (et si ce n'est pas le cas, la recette a de toute façon échoué de toute façon). Cela échoue également si le package est installé comme une recette précédente dans la liste d'exécution car ils sont tous compilés ensemble à l'avance. Comment puis-je inclure des éléments dans une recette Chef que cette recette ou runlist s'installe?
myvar
il n'y a pas de vraie réponse, généralement j'évite d'utiliser l'évaluation de code à partir de commandes externes au moment de la compilation, sauf si cela est très nécessaire pour définir d'autres ressources. En bref, je ferais unruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
node.run_state
était exactement ce que je cherchais - merci. Faites-en une réponse et je l'accepterai!Réponses:
J'irais avec
node.run_state
pour stocker une variable transitoire dans une exécution et la définir dans unruby_block
afin qu'il se produise au moment de la convergence, quelque chose comme ceci:Pour autant que je sache, il n'est pas nécessaire d'exiger «mixlib / shellout».
la source
Les détails dépendent du cas d'utilisation exact. Si la valeur n'est utilisée que comme propriété sur une autre ressource, vous utiliserez la
lazy
méthode d'assistance. Si vous n'avez pas besoin de la sortie, vous utiliserez laexecute
ressource. Dans certains cas plus complexes, vous pouvez utiliser uneruby_block
ressource ou écrire votre propre ressource personnalisée.la source