2012-05-13 14 views
6

Diciamo che abbiamo due risorse:blocchi non vedono metodi (risorse chef)

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

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

mi piacerebbe riutilizzare il codice all'interno di risorse. Tuttavia, se definisco un proc nella ricetta, ottieni un NoMethodError per owner, group ecc. Perché succede? Lo scopo lessicale non è diverso, vero? Di conseguenza, devo usare 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

L'errore si verifica se si effettua un globale ('$ common_cfg')? –

+0

La variabile proc è valutata bene, perché il NoMethodError si verifica nel contesto del proc (proprietario, gruppo ecc.) – m33lky

+0

Oh; gotcha: cancellerà il commento. –

risposta

2

a causa di come lo chef è implementata (con un sacco di riflessione) è necessario metterlo in una risorsa di blocco biblioteca o rubino per proteggerlo. Penso che una risorsa di blocco rubino funzionerà perché sarà al di fuori dell'ambito.

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

di solito per questo motivo l'idioma è

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

Il secondo il collegamento è rotto – Eye

+0

@Eye rimosso poiché non è più rilevante – EnabrenTane

Problemi correlati