2013-10-28 9 views
6

Mam receptury i pliki atrybutów dla węzłów. Na przykład. localhost i linode. Próbuję pobrać plik atrybutów do załadowania najpierw (i ustawić nazwę hosta itp.) Przed domyślnymi lub innymi atrybutami. Przykład:Jak najpierw pobrać plik atrybutów bieżącego receptury?

Atrybuty/localhost.rb:

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

include_attribute 'mbdev::common' 

Atrybuty/common.rb

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

receptury/localhost.rb

include_recipe 'mbdev::default' 

listy uruchamiania:

'mbdev::localhost' 

Wygląda na to, że atrybut include_attribute powoduje najpierw załadowanie atrybutu "common". I tak nginx-hosta nie został jeszcze ustawiony ...

Kolejność pojawia się: 1) Ładowanie atrybuty/default.rb 2) Ładowanie atrybuty/common.rb 3) Błąd O +

Jak mogę pobrać localhost.rb do załadowania przed common.rb?

Odpowiedz

10

Domyślnie pliki atrybutów są ładowane w kolejności alfabetycznej. To nie było w pełni spójne wszędzie, ale zostało naprawione w CHEF-2903.

W ten sposób twoja attributes/common.rb jest ładowana przed attributes/localhost.rb tylko dlatego, że pojawia się wcześniej alfabetycznie. Wyjątkiem od reguły jest attributes/default.rb, która jest zawsze ładowana przed innymi plikami atrybutów w książce kucharskiej.

Generalnie kolejność ładowania plików atrybutów jest następujące:

  1. obciążenie atrybuty wszystkich zależności cookbook w kolejności alfabetycznej
  2. lokalnej attributes/default.rb (jest ona istnieje)
  3. obciążenie wszelkie inne atrybuty plików w porządku alfabetycznym według nazwy pliku

Możesz wczytać plik atrybutów wcześniej niż byłby normalnie załadowany przy użyciu include_attribute, ale nie można go później załadować w ten sposób.

Ta logika jest napisana na stałe i nie można jej zmienić.Można wykonać kilka obejście chociaż:

  • Można napisać plików atrybutów w taki sposób, że kolejność obciążenie nie jest ważne już
  • Można wymienić recepty/atrybuty w sposób zgodny z powyższą logiką
  • można wymusić, że plik zostanie ponownie załadowany atrybut:

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

Właśnie rozwiązałeś mój blok mózgowy o tym, jak ten przeklęty przepis wie o pliku atrybutów !!!!! +10 jeśli mógłbym ... ty – MegaMark

1

Dlaczego nie używać override_attribute? Dlatego istnieją :-) Zobacz Attribute Precedence.

+0

to będzie wymagać mnie mieć wszystkie atrybuty związane gospodarza powtarzają się na każdym hoście. – mbdev

+0

Następnie określ rolę dla niego – StephenKing