Vagrant需要roles.json中的属性来破坏现有的Chef项目吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

我有一个现有的chef-solo项目,我试图增加vagrant支持。我通常使用knife在EC2服务器上使用Canonical公布的Ubuntu 10.04 AMI来烹饪这些食谱。

流浪要求我补充chef_typejson_class属性,以我的工作roles/*.json文件,如下所示:

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

如果我将这些添加到角色定义文件中,那么我会得到下一个错误。据推测,这些属性告诉厨师将我的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_typejson_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_typejson_class我的EC2烹饪脚本回到正常工作,但然后流浪者打破。

我在chef-solo命令和Vagrant使用的命令之间的主要区别在于,我的chef-solo命令与我的roles.json文件有直接关系,而Vagrant's则包含在dna.json文件中。

矿:

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以使这些工作成功?

提问于
用户回答回答于

这应该在最新版本的Chef中修复。存在允许无限对象反序列化的JSON漏洞。我相信修复问题也会解决在这里看到的问题。

试试Chef 11和Vagrant 1.5.6

用户回答回答于

虽然我没有遇到这个问题,但我注意到,如果在不同版本的厨师中使用相同的食谱,厨师作为一个移动的目标,往往会发生这样的奇怪事情。

为了消除这种情况,我会尝试的第一件事是让我的厨师版本保持一致。我发现Vagrant VM正在使用版本0.10.0,而EC2 VM正在使用0.9.16--哪一个更重要,或许可以在该版本上进行标准化 - 例如,如果尝试在本地复制EC2系统,则可以重新创建Vagrant基本框(或者在Vagrant网站上查看自己的文档,这些文档相当不错),以便它与在EC2上安装的内容更加匹配。

扫码关注云+社区