how - chef programming language
Aprovisionamiento Vagrant w/Chef (4)
Desafortunadamente, no hay mucha documentación sobre Vagrant en combinación con Chef. Recomiendo echar un vistazo al uso de librarian para administrar sus libros de cocina por usted. Normalmente tengo un bloque similar a este en mi Vagrantfile:
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "chef/cookbooks"
chef.roles_path = "chef/roles"
# ...
end
Creo un nuevo directorio en la raíz de mi proyecto llamado chef
y agrego las siguientes líneas a mi .gitignore
:
# Ignore librarian bundled cookbooks and cache
/chef/cookbooks
/chef/tmp
En el directorio de chef
, puede ejecutar librarian-chef init
y comenzar a agregar libros de cocina al Cheffile
creado como lo haría con un Gemfile:
cookbook "apt",
:git => "git://github.com/fnichol/chef-apt.git",
:ref => "cacher-client-solo-support"
cookbook "imagemagick", "0.2.2"
cookbook "mongodb",
:git => "git://github.com/edelight/chef-cookbooks.git",
:ref => "0.11.0"
Obtiene los beneficios de poder especificar los repositorios de git, las rutas de archivos y las versiones para agrupar, lo que es extremadamente útil cuando utiliza libros de cocina de varias fuentes. Cuando ejecute librarian-chef install
bibliotecario buscará todos los libros de cocina especificados y los almacenará en el directorio de cookbooks
, en relación con la ubicación de su Cheffile.
Estoy investigando lo que se necesita para migrar mis entornos de desarrollo a Vagrant y tengo algunos problemas para manejar el proceso de aprovisionamiento de VM con chef. Nunca he usado chef antes y los documentos de Vagrant en esta área son intencionalmente débiles (fuera de alcance) para poder usar una mano.
Me gustaría hacer esto lo más portátil posible, así que pensé que tenía sentido cargar libros de cocina desde una URL, así que esto es lo que estoy intentando en mi Vagrantfile
:
config.vm.provision :chef_solo do |chef|
chef.recipe_url = ''https://github.com/opscode/cookbooks/tarball/master''
chef.add_recipe ''nginx''
chef.add_recipe ''mysql''
chef.add_role ''web''
# You may also specify custom JSON attributes:
# chef.json = { :mysql_password => '''' }
end
No creo que haya ninguna duda de que simplemente estoy malinterpretando algo, pero no he encontrado una fuente de documentación que parezca encajar en este contexto de Vagrant.
Gracias.
La forma en que se muestra arriba sin duda funcionará bien.
Sin embargo, si va a utilizar Chef solo, recomiendo incrustar los libros de cocina directamente en el repositorio que va al control de versiones. Esto lo hace de modo que en cada punto en el tiempo cuando se comprometa, el Vagrantfile esté alineado con las versiones correctas de los libros de cocina. Por lo tanto, en 2 años, cuando revise el código de hoy, los libros de cocina deberían funcionar técnicamente.
Si desea recorrer esta ruta, cree un directorio, como cookbooks
, que contenga los libros de cocina. Entonces configura Vagrant así:
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe ''nginx''
chef.add_recipe ''mysql''
chef.add_role ''web''
# You may also specify custom JSON attributes:
# chef.json = { :mysql_password => '''' }
end
Prefiero un gran repositorio monolítico con todos mis libros de cocina. Así que no uso Bibliotecario o Berkshelf, solo Vagrant y Chef. Uso Chef para crear máquinas virtuales usando VirtualBox, pero también para "hornear" contenedores Docker.
No veo ningún problema de portabilidad con este enfoque. Para el desarrollo local, todas mis cosas de Chef están en un lugar ~/chef
. Tengo una carpeta ~/chef/vagrant
que tiene todos mis archivos de Vagrant.
Mi Vagrantfile
s siempre tendrá algo similar a lo siguiente.
config.vm.provision ''chef_zero'' do |chef|
chef.environment = ''some_environment''
chef.cookbooks_path = ''~/chef/cookbooks''
chef.roles_path = ''~/chef/roles''
chef.data_bags_path = ''~/chef/data_bags''
chef.encrypted_data_bag_secret_key_path = ''~/chef/chef_key''
chef.environments_path = ''.''
chef.nodes_path = ''~/chef/nodes''
chef.add_recipe ''motd''
chef.add_recipe ''..''
chef.version = ''12.14.89''
# chef.log_level = ''debug''
end
También puedes usar Berkshelf para administrar tus libros de cocina por ti. Berkshelf realmente facilita la administración de libros de cocina.
Todo lo que necesita hacer es instalar la gema berkshelf y ejecutar berks init para generar un archivo Berks vacío.
Hay varias formas diferentes de agregar libros de cocina al archivo berks para resolver dependencias.
Ejemplo:
Para resolver los libros de cocina del uso del supermercado:
source ''http://chefsupermarket.com''
cookbook ''mycookbook'', ''~> 1.3.6''
Para resolver desde el uso de git:
cookbook "mycookbook", git: "https://github.com/cookbooks/mycookbook.git"
también puede mantener libros de cocina en su directorio local y resolverlos usando berksfile usando:
cookbook ''mycookbook'', path: ''/path_to_my/chef/cookbook''