2012-05-13 4 views
6

Допустим, у нас есть два ресурса:блоки не видят методы (шашлычник ресурсы)

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

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

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

Возникает ли ошибка, если вы сделаете это глобальный ('$ common_cfg')? –

+0

Переменная proc оценивается штрафом, поскольку NoMethodError встречается в контексте proc (владелец, группа и т. Д.) – m33lky

+0

Oh; gotcha - удалит комментарий. –

ответ

2

из-за того, как реализован повар (с большим количеством отражения), нужно поместить его в библиотеку или рубинового блока ресурсов, чтобы защитить его. Я думаю, что ресурс блока ruby ​​будет работать, потому что он будет за пределами видимости.

http://wiki.opscode.com/display/chef/Libraries

обычно по этой причине идиома

["file_one","file_two"].each do |file| 
    template file do 
    owner "root" 
    group "root" 
    end 
end 
+0

Второй ссылка сломана. – Eye

+0

@ Удалить, поскольку оно больше не актуально – EnabrenTane