2013-09-24 4 views
8

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

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. Вы можете использовать рубиновый API для поиска вложенных атрибутов.

Chef Узел Объект предоставляет ряд вспомогательных методов, как:

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

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

node.debug_value(:foo, :bar) 

Подробности можно найти из статьи Chef 11 In-Depth: Attributes Changes

2

Ознакомьтесь с поваренной книжкой повара-сахара deep_fetch, минимумы для надежных ссылок на глубокие атрибуты.

4

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

Например, cookbook/attributes/default.rb будет содержать:

default[:parent][:child] = nil 

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

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

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

Смежные вопросы