18

サポートchef-soloを追加しようとしている既存のプロジェクトがあります。vagrant私は通常、Canonical が公開した Ubuntu 10.04 AMI を使用して EC2 サーバーでこれらのレシピを調理するためにナイフを使用します。

Vagrant では、次のように作業ファイルにchef_type属性json_classを追加する必要があります。roles/*.json

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

これらをロール定義ファイルに追加しないと、次のエラーが発生します。おそらくこれらの属性は、私の JSON ファイルを Chef::Role クラスのインスタンスのように扱うように Chef に指示します。

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

と EC2 のクッキング スクリプトを削除するchef_typejson_class、通常どおり動作するようになりますが、Vagrant が壊れます。

私のchef-soloコマンドとVagrantで使用されるコマンドとの主な違いは、私のchef-soloコマンドはroles.jsonファイルと直接関係があるのに対し、Vagrantのものは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 "

放浪者:

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

これらを機能させるために Vagrantfile を構成する方法はありますか?

4

2 に答える 2

1

この特定の問題に遭遇したことはありませんが、異なるバージョンのChefで同じレシピを使用している場合、Chefは移動ターゲットとして、このような奇妙なことが起こる傾向があることに気付きました。

それを排除するために、私が最初に試みることは、シェフのバージョンを一貫させることです。Vagrant VMがバージョン0.10.0を使用し、EC2 VMが0.9.16を使用していることがわかります。どちらか重要な方、おそらくそのバージョンで標準化できます。たとえば、EC2システムをローカルで複製しようとしている場合は、次のことができます。 EC2にインストールしたものとより厳密に一致するように、Vagrantベースボックスを再作成します(または、独自の作成を検討します。ドキュメントはVagrant Webサイトで非常に優れています)。

于 2012-01-05T22:51:58.743 に答える
0

これは、最新バージョンの Chef で修正する必要があります。無限のオブジェクト デシリアライゼーションを可能にする JSON の脆弱性がありました。その問題を修正することで、ここで表示されている問題も修正されると思います。

Chef 11 と Vagrant 1.5.6 を試す

于 2013-02-17T03:58:04.560 に答える