6

2 つのリソースがあるとします。

template 'template1' do
  owner 'root'
  group 'root'
end

template 'template2' do
  owner 'root'
  group 'root'
end

リソース内のコードを再利用したい。しかし、レシピで 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
4

1 に答える 1

2

chefの実装方法(多くの反射を伴う)のため、それを保護するためにライブラリまたはrubyブロックリソースに配置する必要があります。ルビーブロックリソースは範囲外になるのでうまくいくと思います。

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

通常、この理由でイディオムは

["file_one","file_two"].each do |file|
  template file do
    owner "root"
    group "root"
  end
end
于 2012-07-05T16:14:35.357 に答える