Chefにネストされた属性が存在するかどうかを確認する方法は複数ありますが、どれが正しいか、または最適かはわかりません。空の属性がノードに格納される場合は、次のようにします。
node[:parent] and node[:parent][:child]
node.attribute?(:parent) and node[:parent].attribute?(:child))
node[:parent].nil? and node[:parent][:child].nil?
親子を同時にチェックできる方がいいのですが、それが可能かどうかはわかりません。私はChef11ではなくChef10を使用していますが、どちらかを説明する回答は大歓迎です。
ノード属性オブジェクトはHashMapです。 RubyネイティブAPIを使用して、ネストされた属性を検索できます。
Chef Node Objectは、次のような多くのヘルパーメソッドを提供します。
_node.attribute?()
node[:foo].attribute?(:bar)
node[:foo].member?(:bar)
_
Chef11には新しいメソッドnode.debug_value()
もあり、ノード属性のデバッグに役立ちます。これも役立ちます。
_node.debug_value(:foo, :bar)
_
詳細は記事から見つけることができます シェフ11の詳細:属性の変更
私が最近これを解決した方法は、可能な場合はクックブックで使用される属性のデフォルト値を常に設定することでした。
例えば、 cookbook/attributes/default.rb
には次のものが含まれます:
default[:parent][:child] = nil
また、レシピでは、属性値のチェックを次のように減らすことができます。
node[:parent][:child].nil?
もちろん、通常は、使用可能なデフォルト値を設定し、まったくチェックする必要がない方がはるかに便利です。
シェフシュガークックブックをチェックしてください deep_fetch
深い属性への安全な参照を可能にする拡張。