Блоки не видят методы (ресурсы шеф-повара)
Допустим, у нас есть два ресурса:
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