2011-05-26 22 views
18

Tengo un proyecto existente chef-solo al cual estoy tratando de agregar el soporte vagrant. Normalmente uso un cuchillo para cocinar estas recetas en servidores EC2 usando Ubuntu 10.04 AMIs publicado por Canonical.Vagrant requiere atributos en roles.json que rompen el proyecto Chef existente

Vagrant requiere que agrego chef_type y json_class atributos a mis roles/*.json archivos de trabajo, como este:

{ 
    "name": "memcached", 
    "chef_type": "role", 
    "json_class": "Chef::Role", 
    "run_list": ["base", "memcached"] 
} 

Si No añadir estos en el fichero de definición de funciones, entonces me sale este error siguiente . Presumiblemente, estos atributos le dicen al chef que trate mi archivo JSON como una instancia de la clase Chef :: Role.

[default] [Thu, 26 May 2011 02:19:44 +0200] DEBUG: NoMethodError: undefined method `run_list_for' for {"name"=>"memcached", "run_list"=>["wantsa", "memcached"]}:Hash 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/run_list/run_list_expansion.rb:139:in `expand_run_list_items' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/run_list/run_list_expansion.rb:78:in `expand' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/run_list.rb:138:in `expand' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/node.rb:437:in `expand!' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/client.rb:249:in `build_node' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/client.rb:151:in `run' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/application/solo.rb:192:in `run_application' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/application/solo.rb:183:in `loop' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/application/solo.rb:183:in `run_application' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/../lib/chef/application.rb:66:in `run' 
/opt/ruby/lib/ruby/gems/1.8/gems/chef-0.10.0/bin/chef-solo:25 
/opt/ruby/bin/chef-solo:19:in `load' 
/opt/ruby/bin/chef-solo:19 

Sin embargo, cuando trato de cocinar el mismo papel en EC2 la existencia de chef_type y json_class atributos romper el proceso, produciendo el siguiente error. Presumiblemente, esto es debido a que en este caso chef quiere tratar mi definición de funciones como un hash de Rubí (y llamar .delete de ella)

/usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/node.rb:379:in `consume_run_list': undefined method `delete' for #<Chef::Role:0x7fa337535138> (NoMethodError) 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/node.rb:370:in `consume_attributes' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/node.rb:358:in `consume_external_attrs' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/client.rb:222:in `build_node' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/client.rb:145:in `run' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/application/solo.rb:190:in `run_application' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/application/solo.rb:181:in `loop' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/application/solo.rb:181:in `run_application' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/../lib/chef/application.rb:62:in `run' 
    from /usr/lib/ruby/gems/1.8/gems/chef-0.9.16/bin/chef-solo:25 
    from /usr/bin/chef-solo:19:in `load' 
    from /usr/bin/chef-solo:19 
rake aborted! 

Cuando quito el chef_type y json_class mis guiones de cocina EC2 volver a trabajar de forma normal, pero luego Vagrant está roto.

La principal diferencia que veo entre mi comando de chef solo y el utilizado por Vagrant es que mi comando chef-solo tiene una relación directa con mi archivo roles.json, mientras que Vagrant está incluido en el archivo dna.json.

Mina:

ssh [email protected] "cd /etc/chef; sudo env chef_environment=production chef-solo -l info -c config/solo.rb -j roles/memcached.json " 

vagabundos:

cd /tmp/vagrant-chef 
chef-solo -c solo.rb -j dna.json 

¿Hay alguna manera de que puedo configurar mi Vagrantfile para hacer estos trabajos?

Respuesta

1

Si bien no me he encontrado con este problema en particular, he notado que el Chef, como objetivo en movimiento, tiende a tener cosas extrañas como estas si usa las mismas recetas en diferentes versiones de Chef.

Solo para eliminar eso, lo primero que intentaré es hacer que las versiones de mi chef sean consistentes. Veo que su máquina virtual Vagrant está utilizando la versión 0.10.0 y su máquina virtual EC2 está usando 0.9.16, lo que sea más importante, tal vez podría estandarizar en esa, por ejemplo. Si está tratando de replicar su sistema EC2 localmente, puede recrear su caja base Vagrant (o buscar la suya propia, la documentación es bastante buena en el sitio web Vagrant) de modo que coincida más con lo que tiene instalado en EC2.

0

Esto debería solucionarse en la última versión de Chef. Había una vulnerabilidad JSON que permitía la deserialización infinita de objetos. Creo que los problemas de solución también arreglarán el problema que está viendo aquí.

Pruebe Chef 11 y Vagrant 1.5.6

Cuestiones relacionadas