Comment cuisiner des choses qui n'existent pas encore

9

Disons que j'ai du code Chef comme:

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

/bin/somecommandn'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?

Gaius
la source
Ce genre de chose n'est pas un problème dans CFEngine
Gaius
1
Sans un aperçu de l'utilisation de, myvaril 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.[...] }
Tensibai
@Tensibai node.run_stateétait exactement ce que je cherchais - merci. Faites-en une réponse et je l'accepterai!
Gaius
Cela devra attendre jusqu'à demain :) trop dur pour écrire une bonne réponse par téléphone
Tensibai

Réponses:

4

J'irais avec node.run_statepour stocker une variable transitoire dans une exécution et la définir dans un ruby_blockafin qu'il se produise au moment de la convergence, quelque chose comme ceci:

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

Pour autant que je sache, il n'est pas nécessaire d'exiger «mixlib / shellout».

Tensibai
la source
2

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 lazyméthode d'assistance. Si vous n'avez pas besoin de la sortie, vous utiliserez la executeressource. Dans certains cas plus complexes, vous pouvez utiliser une ruby_blockressource ou écrire votre propre ressource personnalisée.

coderanger
la source