2013-10-28 5 views
6

Ho ricette e file di attributi per i nodi. Per esempio. localhost e linode. Sto cercando di caricare il file di attributo prima (e di impostare il nome host ecc.) Prima del valore predefinito o di altri attributi. Esempio:Come ottenere il file dell'attributo della ricetta corrente da caricare per primo?

attributi/localhost.rb:

default[:hostname] = "localhost" 
default[:nginx][:hostname] = 'mbdev-localhost' 

include_attribute 'mbdev::common' 

attributi/common.rb

default[:nginx][:website1][:url] = "subdomain." + default[:nginx][:hostname] 

ricette/localhost.rb

include_recipe 'mbdev::default' 

elenco di esecuzione:

'mbdev::localhost' 

Tuttavia sembra include_attribute rende l'attributo 'comune' da caricare prima. E così nginx-hostname non è ancora impostato ...

L'ordine ricevo è: attributi 1) Caricamento/default.rb 2) Caricamento attributi/common.rb 3) Errore sul +

Come posso caricare localhost.rb prima di common.rb?

risposta

10

Per impostazione predefinita, i file di attributo vengono caricati in ordine alfabetico. Questo non era completamente coerente ovunque, ma era stato risolto in CHEF-2903.

Così, il tuo attributes/common.rb viene caricato prima di attributes/localhost.rb semplicemente perché viene fornito in ordine alfabetico. Un'eccezione dalla regola è attributes/default.rb che viene sempre caricata prima di qualsiasi altro file di attributi in un ricettario.

Generalmente, l'ordine di caricamento di file di attributo è il seguente:

  1. carico gli attributi di tutte le dipendenze ricettario in ordine alfabetico
  2. locale attributes/default.rb (è presente)
  3. carico altri attributi file in ordine alfabetico per nome file

È possibile caricare un file di attributo prima di quello che verrebbe normalmente caricato utilizzando include_attribute, ma non è possibile caricarlo più tardi in questo modo.

Questa logica è hardcoded nello chef e non può essere modificata.È possibile eseguire un paio di work-around però:

  • Si potrebbe scrivere i file di attributi in un modo che ordine di caricamento non è importante più
  • Si potrebbe nominare le ricette/attributi in modo coerente con la logica di cui sopra
  • è possibile imporre che un file di attributo viene caricato di nuovo:

    node.from_file(run_context.resolve_attribute("cookcook_name", "attribute_file")) 
    
+0

Hai appena risolto il mio blocco mentale su come la dannata ricetta sa del file degli attributi !!!!! +10 se potessi ... ty – MegaMark

1

Perché non utilizzare override_attribute? Ecco perché esistono :-) Vedi Attribute Precedence.

+0

che mi richiedono di avere tutti gli attributi relativi ospitanti si ripetono su ogni host. – mbdev

+0

Quindi definisci un ruolo per esso – StephenKing

Problemi correlati