Cómo cocinar cosas que aún no existen

9

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?

Gayo
fuente
Este tipo de cosas no es un problema en CFEngine
Gaius
1
Sin una idea sobre el uso de 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.[...] }
Tensibai
@Tensibai node.run_stateera exactamente lo que estaba buscando, gracias. ¡Responda eso y lo aceptaré!
Cayo
Eso tendrá que esperar hasta mañana :) demasiado difícil para escribir una respuesta correcta por teléfono
Tensibai

Respuestas:

4

Me gustaría ir node.run_statea almacenar una variable transitoria en una ejecución y definirla de ruby_blockmanera que ocurra en el tiempo de convergencia, algo como esto:

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

Hasta donde sé, no es necesario 'mixlib / shellout'.

Tensibai
fuente
2

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 el executerecurso. En algunos casos más complejos, puede usar un ruby_blockrecurso o escribir su propio recurso personalizado.

coderanger
fuente