2012-05-13 10 views
6

Lassen Sie uns sagen, wir haben zwei Ressourcen:Blöcke nicht sehen, Methoden (Koch Ressourcen)

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

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

I-Code in Ressourcen wiederverwenden möchten. Wenn ich jedoch einen Prozess im Rezept definiere, erhält man einen NoMethodError für owner, group usw. Warum passiert das? Lexikalischer Bereich ist nicht anders, oder? Als Ergebnis muss ich self.instance_eval &common_cfg verwenden.

+0

tritt der Fehler auf, wenn Sie es ein globales ('$ common_cfg') machen? –

+0

Die proc-Variable wird gut ausgewertet, weil NoMethodError im Kontext des proc (Eigentümer, Gruppe usw.) auftritt – m33lky

+0

Oh; Gotcha - wird Kommentar löschen. –

Antwort

2

wegen der Art und Weise, wie Koch implementiert wird (mit viel Reflexion), müssen Sie es in eine Bibliothek oder Ruby Block Ressource, um es zu schützen. Ich denke, eine Rubinblock-Ressource wird funktionieren, weil sie außerhalb des Geltungsbereichs liegt.

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

in der Regel aus diesem Grund das Idiom ist

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

Die zweite Link ist kaputt. – Eye

+0

@Eye entfernt, da es nicht mehr relevant ist – EnabrenTane