Vagrant требует атрибуты в role.json, которые нарушают существующий проект Chef - PullRequest
18 голосов
/ 26 мая 2011

У меня есть существующий chef-solo проект, в который я пытаюсь добавить поддержку vagrant.Обычно я использую нож для приготовления этих рецептов на серверах EC2, используя AMI Ubuntu 10.04, опубликованные Canonical.

Vagrant требует, чтобы я добавил атрибуты chef_type и json_class в мои рабочие файлы roles/*.json, например:

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

Если я не добавлю их в файл определения роли, я получу следующую ошибку.Предположительно, эти атрибуты говорят chef обрабатывать мой JSON-файл как экземпляр класса 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

Однако, когда я пытаюсь приготовить ту же роль в EC2, наличие chef_type и json_class атрибуты нарушают процесс, приводя к следующей ошибке.Предположительно, это связано с тем, что в этом случае шеф-повар хочет рассматривать мое определение роли как хэш Ruby (и вызывать .delete из него)

/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!

Когда я удаляю chef_type и json_class моего приготовления EC2сценарии возвращаются к нормальной работе, но затем Vagrant не работает.

Основное различие, которое я вижу между моей командой chef-solo и используемой Vagrant, заключается в том, что моя команда chef-solo имеет прямое отношение кмой файл role.json, а файл Vagrant обернут в файл dna.json.

Mine:

ssh ubuntu@ec2-xxx-xxx-xxx-xxx.us-west-1.compute.amazonaws.com "cd /etc/chef; sudo env chef_environment=production chef-solo -l info -c config/solo.rb -j roles/memcached.json "

Vagrants:

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

Есть ли какой-нибудь способчто я могу настроить мой Vagrantfile, чтобы они работали?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Хотя я не сталкивался с этой конкретной проблемой, я заметил, что Chef, как движущаяся цель, склонен к тому, чтобы происходили странные вещи, подобные этому, если вы используете одни и те же рецепты в разных версиях Chef.

Просто, чтобы устранить это, первое, что я бы попробовал, - это согласовать версии моего шеф-повара. Я вижу, что ваша Vagrant VM использует версию 0.10.0, а ваша EC2 VM использует 0.9.16 - в зависимости от того, что важнее, возможно, вы могли бы стандартизировать эту, например. если вы пытаетесь реплицировать свою систему EC2 локально, вы можете воссоздать базовый блок Vagrant (или посмотреть, как создать свой собственный, документация довольно хороша на веб-сайте Vagrant), чтобы он более точно соответствовал тому, что вы установили EC2.

0 голосов
/ 17 февраля 2013

Это должно быть исправлено в последней версии Chef. Существовала уязвимость JSON, которая допускала бесконечную десериализацию объектов. Я полагаю, что исправление проблем для этого также исправит проблему, которую вы видите здесь.

Попробуйте Chef 11 и Vagrant 1.5.6

...