2013-09-24 92 views
8

有多種方式,以檢查廚師嵌套屬性的存在,我不知道這是正確的/最好的,如果有的話會導致空屬性被存儲在節點上:檢查Chef中是否存在嵌套屬性的正確方法是什麼?

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

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

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

能夠同時檢查父母和孩子是非常受歡迎的,但我不知道這是否可能。我使用的是廚師10,而不是廚師11,儘管解釋的答案是受歡迎的。

回答

11

節點屬性對象是HashMap。你可以使用ruby本地API來查找嵌套屬性。

廚師節點對象提供了一些輔助方法,如:

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

也有在廚師11的新方法node.debug_value()幫你調試節點屬性,這也是有幫助的:

node.debug_value(:foo, :bar) 

詳細內容可以從文章中找到Chef 11 In-Depth: Attributes Changes

2

查看廚師 - 糖食譜deep_fetch extension that al低層爲安全引用深層屬性。

4

我最近解決這個問題的方法是在可能的情況下總是爲烹飪書中使用的屬性設置默認值。

例如,cookbook/attributes/default.rb將包含:

default[:parent][:child] = nil 

而且在配方,對屬性值的任何檢查可以簡化爲:

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

當然,它通常是更爲有用有一個可用的默認值,而不必檢查。

相關問題