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/somecommand
aú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?
myvar
no 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_state
era exactamente lo que estaba buscando, gracias. ¡Responda eso y lo aceptaré!Respuestas:
Me gustaría ir
node.run_state
a almacenar una variable transitoria en una ejecución y definirla deruby_block
manera 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
lazy
método auxiliar. Si no necesita la salida, usaría elexecute
recurso. En algunos casos más complejos, puede usar unruby_block
recurso o escribir su propio recurso personalizado.fuente