2012-05-13 6 views
6

は、我々は2つのリソースを持っているとしましょう方法(シェフのリソース)を参照してくださいしないでください。しかし、私がレシピでprocを定義すると、ownergroupなどのNoMethodErrorが発生します。どうしてですか?レキシカルスコープは違いはありませんか?その結果、self.instance_eval &common_cfgを使用しなければなりません。なぜならシェフは、(反射のたくさんの)実装されているかのブロックは

common_cfg = Proc.new { 
    owner 'root' 
    group 'root' 
} 

template 'template1' do 
    common_cfg.call 
end 

template 'template2' do 
    common_cfg.call 
end 
+0

であるあなたがそれグローバル( '$のcommon_cfg')にすると、エラーが発生しますか? –

+0

NoMethodErrorがproc(所有者、グループなど)のコンテキストで発生するため、proc変数はきれいに評価されます。 – m33lky

+0

ああ、 gotcha - コメントを削除します。 –

答えて

2

あなたはそれを保護するために、ライブラリやルビーブロックリソースでそれを配置する必要があります。私はそれが範囲外になるので、rubyブロックリソースが動作すると思います。

http://wiki.opscode.com/display/chef/Libraries

通常このような理由のためにイディオムは

["file_one","file_two"].each do |file| 
    template file do 
    owner "root" 
    group "root" 
    end 
end 
+0

第2リンクが壊れています。 – Eye

+0

@Eyeは関連性がなくなったため削除されました – EnabrenTane