m33*_*lky 6 ruby code-reuse closures chef-infra lexical-scope
假设我们有两个资源:
template 'template1' do
owner 'root'
group 'root'
end
template 'template2' do
owner 'root'
group 'root'
end
Run Code Online (Sandbox Code Playgroud)
我想在资源中重用代码.但是,如果我在配方定义一个进程,你会得到一个NoMethodError owner,group等它为什么会发生?词汇范围没有什么不同,是吗?因此我必须使用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
Run Code Online (Sandbox Code Playgroud)
由于 Chef 的实现方式(有很多反思),您需要将其放入库或 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
Run Code Online (Sandbox Code Playgroud)