¿Manera idiomática de invocar al chef solo?

8

¿Cuál es la forma idiomática de invocar al chef solo? La mayoría de los sitios hacen esto:

chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz

Pero eso es largo. Hay algunas formas más cortas de hacerlo que se me ocurren:

  1. Una tarea de rastrillo ( rake chef-solo).
  2. Un pequeño script de shell ( run-chef-solo).
  3. Un alias (puede anular el nombre, como chef-solo).

¿Cuál es la forma idiomática de hacer esto? ¿Cómo están invocando otros usuarios chef?

Kerkeslager
fuente

Respuestas:

8

Por defecto, chef-sololee su configuración desde /etc/chef/solo.rb. Los parámetros de la línea de comandos corresponden a los valores de configuración que se pueden establecer en este archivo. Esto se hace usando la biblioteca mixlib-config.

  option :config_file, 
    :short => "-c CONFIG",
    :long  => "--config CONFIG",
    :default => "/etc/chef/solo.rb",
    :description => "The configuration file to use"

  option :json_attribs,
    :short => "-j JSON_ATTRIBS",
    :long => "--json-attributes JSON_ATTRIBS",
    :description => "Load attributes from a JSON file or URL",
    :proc => nil

  option :recipe_url,
      :short => "-r RECIPE_URL",
      :long => "--recipe-url RECIPE_URL",
      :description => "Pull down a remote gzipped tarball of recipes and untar it to the cookbook ca
che.",
      :proc => nil

La 'opción' es el valor del archivo de configuración.

El archivo de configuración real /etc/chef/solo.rbse vería así:

file_cache_path "/tmp/chef-solo"
cookbook_path   "/tmp/chef-solo/cookbooks"
role_path       "/tmp/chef-solo/roles"
json_attribs    "/tmp/chef-solo/node.json"
recipe_url      "http://www.example.com/chef-solo.tar.gz"

También tenga en cuenta que el archivo JSON también puede ser una URL remota.

json_attribs    "http://www.example.com/node.json"

También puede usar Ohai como biblioteca dentro del archivo de configuración, para detectar la plataforma u otros atributos para especificar qué archivo JSON usar.

require 'rubygems'
require 'ohai'
o = Ohai::System.new
o.all_plugins
file_cache_path "/tmp/chef-solo"
cookbook_path   "/tmp/chef-solo/cookbooks"
role_path       "/tmp/chef-solo/roles"
json_attribs    "/tmp/chef-solo/#{o[:platform]}.json"
recipe_url      "http://www.example.com/chef-solo.tar.gz"

Y luego tendría archivos JSON específicos de "plataforma", por ejemplo. O puede usar o[:hostname], o[:domain]o o[:fqdn]usar archivos JSON basados ​​en el nombre de host, dominio o fqdn. Pero una vez que comience a tener el andamiaje de servidores para admitir este tipo de configuración dinámica, puede considerar ejecutar un Servidor Chef :-).

jtimberman
fuente
1

@jtimberman ya ha escrito una gran respuesta. Aquí está mi forma personal de invocar al chef solo. Esto hace que los conceptos básicos funcionen y probablemente necesitará agregar más atributos /etc/chef/node.jsony explorar algunas de las opciones descritas en la otra respuesta.

# cat > /etc/chef/solo.rb << EOF
cookbook_path    "/var/chef-solo/cookbooks"
json_attribs     "/etc/chef/node.json"
EOF

# cat > /etc/chef/node.json << EOF
{
  "run_list": ["recipe[foo]", "recipe[bar]"]
}
EOF

Copie sus libros de cocina en /var/chef-solo/cookbookstar.gz en un servidor web y use el recipe_urlparámetro. Ejecutar chef-soloen el nodo es todo lo que se necesita para invocarlo.

Si es posible, trato de mantener todo dentro solo.rbya que me gusta poder ejecutar solo chef sin tener que recordar ningún argumento adicional.

Tim Potter
fuente