Chef: multiplataforma para libros de cocina

Los libros de cocina multiplataforma son aquellos libros de cocina que adoptan un entorno subyacente en el que se va a ejecutar. Chef proporciona una serie de funciones que ayudan a escribir libros de cocina multiplataforma capaces de ejecutarse en cualquier sistema operativo en el que se vaya a implementar. Esto ayuda al desarrollador a escribir un libro de cocina completamente operativo.

Para hacer esto, necesitamos tener un libro de cocina. En nuestro caso, será test_cookbook y una lista de ejecución que tendrá la definición del libro de recetas.

Método de trabajo

Recuperar el detalle de la plataforma de los nodos y ejecutar la lógica condicional en nuestro libro de recetas depende de la plataforma. En nuestro caso, lo probaremos para Ubuntu.

Step 1 - Registra un mensaje si el nodo es Ubuntu.

[email protected]:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Log.info("Running on ubuntu") if node.platform['ubuntu']

Step 2 - Sube el libro de cocina al servidor Chef.

[email protected]:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Uploading my_cookbook [0.1.0] 
Uploaded 1 cookbook.

Step 3 - Ejecute el cliente Chef en el nodo.

[email protected]:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu 
...TRUNCATED OUTPUT...

Alternativamente, si uno no está interesado en una plataforma específica pero solo necesita saber cuál declarativa está usando, se puede usar la siguiente declaración.

Log.info("Running on a debian derivative") if 
platform_family?('debian')

Cargar el libro de cocina modificado y ejecutar el cliente Chef en el nodo de Ubuntu mostrará el siguiente resultado.

[2013-03-03T20:16:14+00:00] INFO: Running on a debian 
derivative

Flujo de trabajo de scripts

En el comando anterior, Ohai descubrirá el estado actual del sistema operativo del nodo y lo almacenará como un atributo de plataforma con el objeto del nodo.

node['platform']

O puede usar la sintaxis de estilo de método:

node.platform

Establecer valores específicos de la plataforma

Para establecer valores específicos de la plataforma, chef ofrece métodos convenientes value_for_platform y value_for_platform_family. Se pueden usar para evitar declaraciones de casos complejas y usar un hash simple en su lugar.

Libro de cocina de ejemplo

execute "start-runsvdir" do 
   command value_for_platform( 
      "debian" => { "default" => "runsvdir-start" }, 
      "ubuntu" => { "default" => "start runsvdir" }, 
      "gentoo" => { "default" => "/etc/init.d/runit-start start" } 
   ) 
   action :nothing 
end

En el ejemplo anterior, el comando es específico del sistema operativo según lo definido.

  • Para Debian, funcionará "runsvdir-start"
  • Para Ubuntu, "start runsvdir" funcionará
  • Para Gentoo, "/etc/init.d/runit-start" funcionará