2013-09-24 20 views
8

Istnieje wiele sposobów, aby sprawdzić istnienie zagnieżdżonego atrybutu w szefa kuchni, i nie jestem pewien, co jest poprawne/najlepiej, a jeśli spowoduje pustych atrybutów są przechowywane w węźle:Jaki jest poprawny sposób sprawdzenia istnienia zagnieżdżonego atrybutu w Chef?

node[:parent] and node[:parent][:child] 

node.attribute?(:parent) and node[:parent].attribute?(:child)) 

node[:parent].nil? and node[:parent][:child].nil? 

Byłoby bardzo korzystne, aby móc jednocześnie sprawdzić rodzica i dziecko, ale nie wiem, czy to możliwe. Używam Chef 10, a nie Chef 11, chociaż odpowiedzi wyjaśniające są mile widziane.

Odpowiedz

11

Obiektem atrybutów węzła jest HashMap. Możesz użyć natywnego API ruby ​​do wyszukiwania atrybutów zagnieżdżonych.

obiektu Chef Węzeł zapewnia szereg metod pomocniczych, takich jak:

node.attribute?() 
node[:foo].attribute?(:bar) 
node[:foo].member?(:bar) 

Jest też nowa metoda node.debug_value() w szefa kuchni 11, aby pomóc Ci atrybuty węzłów debugowania, który jest również pomocny:

node.debug_value(:foo, :bar) 

Szczegółowe informacje można znaleźć w artykule: Chef 11 In-Depth: Attributes Changes

2

Zapoznaj się z książką kucharską-cukiernikiem deep_fetch minimalne bezpieczne odniesienia do głębokich atrybutów.

4

Sposób, w jaki rozwiązałem ten problem, polegał na tym, że zawsze tam, gdzie to możliwe, ustawiane są domyślne wartości atrybutów używanych w książce kucharskiej.

Na przykład cookbook/attributes/default.rb będzie zawierać:

default[:parent][:child] = nil 

a w recepturze, każdy czek na wartości atrybutów może być zmniejszona do:

node[:parent][:child].nil? 

Oczywiście, to zwykle o wiele bardziej użyteczne mieć użyteczną wartość domyślną i nie musi w ogóle sprawdzać.

Powiązane problemy