6

假设我们有两个资源:

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

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

我想在资源中重用代码。但是,如果我在配方中定义了一个 proc,你会得到一个 NoMethodErrorownergroup。为什么会这样?词法范围没有什么不同,是吗?结果我不得不使用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 回答