Блоки не видят методы (ресурсы шеф-повара)

Допустим, у нас есть два ресурса:

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

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

Я хотел бы повторно использовать код внутри ресурсов. Однако, если я определю процедуру в рецепте, вы получите 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

1 ответ

Из -за того, как реализован 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
Другие вопросы по тегам