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