Как правильно проверить наличие вложенного атрибута в Chef?

существует несколько способов проверить наличие вложенного атрибута в chef, и я не уверен, что правильно/лучше, и если таковые будут, то пустые атрибуты будут храниться на узле:

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

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

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

было бы очень желательно иметь возможность проверять родителя и ребенка одновременно, но я не знаю, возможно ли это. Я использую Chef 10, а не Chef 11, хотя ответы, объясняющие либо приветствуются.

3 ответов


объект атрибута узла-HashMap. Для поиска вложенных атрибутов можно использовать собственный API ruby.

Chef Node Object предоставляет ряд вспомогательных методов, таких как:

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

существует также новый метод node.debug_value() в chef 11, чтобы помочь вам отладить атрибуты узла, которые также полезны:

node.debug_value(:foo, :bar)

подробности можно найти в статье Chef 11 In-Depth: Изменения Атрибутов


в последнее время я решил это, чтобы всегда устанавливать значения по умолчанию для атрибутов, используемых в поваренной книге, где это возможно.

например, cookbook/attributes/default.rb содержит:

default[:parent][:child] = nil

и в рецепте любая проверка значения атрибутов может быть уменьшена до:

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

конечно, обычно гораздо полезнее иметь полезное значение по умолчанию и не проверять вообще.


Проверьте шеф-повар-сахар поваренная книга deep_fetch расширение, которое позволяет безопасно ссылаться на глубокие атрибуты.