Tiempo de comstackción frente a tiempo de ejecución en recetas de Chef

Tengo la siguiente receta (simplificada) llamada java, para instalar Java, por supuesto.

Recetas de archivo / default.rb

include_recipe "install_java" 

Recetas de archivo / install_java.rb

 # Install RPM from yum repo via yum_install library function yum_install("jdk1.7.0_51") # List the directories in /usr/java jdk_dir = `ls -ld /usr/java/jdk1.* | sort | tail -1` if jdk_dir.empty? raise "Missing JDK installation" end 

Cuando ejecuto la receta por “chef-cliente -o receta [java]”

 Synchronizing Cookbooks: - java Compiling Cookbooks... ls: /usr/java/jdk1.*: No such file or directory 

=============================================== ====================== Error de comstackción de la receta en /var/chef/cache/cookbooks/java/recipes/default.rb ===== =============================================== ====================

 RuntimeError ------------ Missing JDK installation 

Parece que la función yum_install () NO se está llamando. Sin embargo, si modifico la receta install_java.rb solo tengo

 # Install RPM from yum repo via yum_install library function yum_install("jdk1.7.0_51") 

funciona.

¿Por qué es esto?

Ok, entonces el Chef corre toma dos pases.

“Tiempo de comstackción”

Me gusta llamar a esto la fase de recostackción .
En este punto, se ejecuta el código ruby ​​real en su receta. Eso significa cualquier statement como jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1 jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1 jdk_dir = ls -ld /usr/java/jdk1.* | sort | tail -1 van a ser ejecutados en ese punto. Sin embargo, el código Ruby que crea un recurso Chef yum_install("jdk1.7.0_51") solo crea los recursos. Esos recursos, creados por su código de receta, se agregan al Chef resource_collection , pero las acciones de recursos NO se ejecutan aún.

“Tiempo convergente”

Yo llamo a esto la fase de resolución . En este momento, después de que se hayan ejecutado TODAS las recetas (creando recursos, pero no ejecutando acciones), ahora estamos listos para ejecutar realmente las acciones de recursos. Chef comienza con el primer recurso en resource_collection y ejecuta la acción especificada en ese recurso. Funciona a través de la colección, llamando a las notificaciones según sea necesario, hasta que se hayan ejecutado todas las acciones de los recursos. Entonces tu carrera está completa.

Su caso específico

Entonces, en su caso, está tratando de acceder al directorio en la fase de recostackción, pero no crea el directorio hasta la fase de resolución . Si desea ejecutar código Ruby durante la fase de resolución , puede hacerlo en un recurso ruby_block . Por ejemplo:

 ruby_block 'verify java is there' do block do if jdk_dir.empty? raise "Missing JDK installation, reinstall" end end end 

Si este recurso ruby_block se coloca después de su yum_install (que probablemente debería ser yum_package ), se colocará después del recurso de instalación en collection_phase , y luego se ejecutará durante la fase de resolución (es decir, tiempo de ejecución ) de la ejecución del Chef.

Así que no puedo estar completamente seguro, pero es probable que yum_install sea ​​un recurso (o algún tipo de ayuda que crea un recurso). Las recetas se ejecutan efectivamente en dos pasos. Primero se ejecuta cada archivo (literalmente a través del exec de Ruby). Cuando se crea un recurso en la DSL, se “comstack” a un objeto de recursos en memoria que se agrega a la colección de recursos global (una gran variedad de todos los recursos). Una vez que se comstackn todos los archivos de recetas, el Chef recorre la colección de recursos y ejecuta las acciones de cada recurso según lo solicitado (enviando notificaciones intermedias si es necesario).

Así que, en general, esto significa que la línea yum_install probablemente no haga nada en el momento en que se ejecuta aparte de insertar un objeto en una matriz. Puede ajustar el otro código en un bloque ruby_code para retrasarlo hasta el momento de convergencia.

Intereting Posts