Digamos que tengo un código de Chef como:
require 'mixlib/shellout'
yum_package 'somepackage'
myvar = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
Donde /bin/somecommandaún no existe porque está instalado por somepackage. Esto fallará en el momento de la compilación de la receta por ese motivo, pero obviamente funcionará en el momento de la convergencia si el paquete se instala con éxito (y si no lo hace, obviamente la receta ha fallado de todos modos). Esto también falla si el paquete está instalado como una receta anterior en la lista de ejecución, ya que todos se compilan juntos por adelantado. ¿Cómo incluyo cosas en una receta de Chef que se instala esa receta o lista de ejecución?

myvarno hay una respuesta real, generalmente evito usar la evaluación de código de comandos externos en tiempo de compilación a menos que sea muy necesario para definir otros recursos. En resumen, haría unruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }node.run_stateera exactamente lo que estaba buscando, gracias. ¡Responda eso y lo aceptaré!Respuestas:
Me gustaría ir
node.run_statea almacenar una variable transitoria en una ejecución y definirla deruby_blockmanera que ocurra en el tiempo de convergencia, algo como esto:Hasta donde sé, no es necesario 'mixlib / shellout'.
fuente
Los detalles dependen del caso de uso exacto. Si el valor solo se usa como una propiedad en otro recurso, usaría el
lazymétodo auxiliar. Si no necesita la salida, usaría elexecuterecurso. En algunos casos más complejos, puede usar unruby_blockrecurso o escribir su propio recurso personalizado.fuente