Назад | Перейти на главную страницу

Поваренные книги шеф-поваров отмечены как выполненные

Я установил в нашей сети сервер Chef, который использую для управления несколькими узлами. На этих узлах установлен шеф-клиент, выполняющийся как демон каждые X минут.

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

Я знаю, что могу избежать выполнения кода или рецепта, который я создаю, как подробно описано здесь: Запретить поварскому рецепту выполнить ранее выполненное действие? но будет ли это означать, что я должен изменить любую кулинарную книгу, которую я загружаю из репозитория opscode.

Другими словами, можно ли заставить сервер шеф-повара (или клиентов) отмечать кулинарные книги как «выполненные», как только они запускаются в первый раз?

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

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


В конкретном случае служб перезапуск обычно запускается через механизм уведомления. В рецепте у вас будет служебный ресурс, который выглядит примерно так:

service "myservice" do
  action :nothing
end

Если после этого рецепт генерирует файл конфигурации для приложения, у вас будет template ресурс, который отправляет уведомление service ресурс:

template "/etc/myapp.conf" do
  notifies :restart, "service[myservice]"
end

В template ресурс имеет встроенную логику, так что если существующие myapp.conf файл совпадает с файлом, созданным Chef, то Chef не будет запускать уведомление о перезапуске службы.


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