假设我们有两个资源:
template 'template1' do
owner 'root'
group 'root'
end
template 'template2' do
owner 'root'
group 'root'
end
我想在资源中重用代码。但是,如果我在配方中定义了一个proc,你会得到owner
,group
等的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 :(得分:2)
因为厨师的实施方式(有很多反思)你需要把它放在库或ruby块资源中来保护它。我认为认为ruby块资源会起作用,因为它将超出范围。
http://wiki.opscode.com/display/chef/Libraries
通常由于这个原因,成语是
["file_one","file_two"].each do |file|
template file do
owner "root"
group "root"
end
end