Как правильно проверить наличие вложенного атрибута в 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
расширение, которое позволяет безопасно ссылаться на глубокие атрибуты.