2016-03-11 2 views
0

Согласно docs (курсив мой):Почему Шеф требует столько атрибутов?

Шеф-клиент использует шесть типов атрибутов для определения значение, которое применяется к узлу во время шеф-клиента перспективе.

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

вы уверены, что это default перекрывает default из поваренной книги? не будет normal лучше для этого случая?

Конечно, я не уверен. Я довольно смущен.

Какие варианты использования оправдывают такую ​​сложность? Почему Шеф требует столько атрибутов?

+1

Это не вопрос для StackOverflow. Если вы хотите обсудить философию дизайна шеф-повара (и как она изменилась с годами), вы можете найти меня на IRC, Slack или в разделе Chef Dev на дискурсе. – coderanger

ответ

3

В общем, шеф не нуждается в нем, он позволяет это для удобства.

Я бы рекомендовал не использовать normal, так как атрибуты этого типа постоянно хранятся в узловом объекте, где default и overrides всегда вычисляются во время компиляции. Для этого важна последовательность приоритетов: override будет окружать normal, который будет окружать default. Схема этого доступна в doc, к которой вы привязались.

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

Пример случая: Я хотел бы установить сервер Apache на 3 коробки, я начну с поваренной делать минимальный установку apache2 с по умолчанию listen_port атрибут 80.

Для моих общих случаев (2 узлов на 3) Я хочу, чтобы Apache прослушивал порт 800 вместо стандартного 80 и добавлял дополнительную конфигурацию. Я сделаю общую оболочку вокруг установки apache, чтобы изменить атрибут listen_port на 800 и выполнить дополнительную конфигурацию.

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

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

В конце дня, для 99% случаев, придерживаться уровня default должно быть достаточно, но другие уровни доступны, когда это необходимо, для быстрого исправления или отладки и т. Д.

0

Смотрите последний раздел этого ответа я дал на предыдущий вопрос:

Using attributes in Chef

скопированных здесь:

Проблемы с Chef Атрибутов, что они выросли органически и проросли много вариантов чтобы попытаться помочь пользователям, которые нарисовали себя в углу. В общем, вам никогда не придется прикасаться к уровням атрибутов автоматического, нормального, force_default или force_override. Вы также должны избегать установки атрибутов в код рецепта. Вы должны перемещать атрибуты настройки в рецептах в файлы атрибутов. Что это такое, эти места устанавливают атрибуты:

в исходном аргументе -j (устанавливает нормальные атрибуты, вы должны ограничить это использование установки run_state, используя это, как правило, обоняние) в файле роли по умолчанию или переопределить уровни приоритетов (осторожно с этим, хотя из-за того, что роли не версируются, и если вы касаетесь этих атрибутов много, вы вызовете производственные проблемы) в файле атрибутов cookbook как по умолчанию или переопределите уровни приоритетов (здесь вы должны установить большую часть своих атрибуты) в файлах среды по умолчанию или переопределять уровни приоритетов (могут быть полезны для таких параметров, как DNS-серверы в центре обработки данных, хотя для этого также можно использовать роли и/или кулинарные книги) Вы также можете устанавливать атрибуты в рецептах, но когда вы делаете то, что вы всегда получаете свой следующий урок в двухфазном парсе анализа слияния, который проходит через рецепты шеф-повара. Если у вас есть рецепты, которые должны общаться друг с другом, лучше использовать node.run_state, который является просто хешем, который не получает письменного атрибута узла. Вы можете удалить node.run_state [: foo] = 'bar' в одном рецепте и прочитать его в другом. Вероятно, вы увидите рецепты, которые устанавливают атрибуты, хотя вы должны знать об этом.