
Я пишу кулинарную книгу, которая использует пользовательские ресурсы, представленные в Chef 12.5. У меня есть пользовательский ресурс, который использует ресурс шаблона и, таким образом, имеетуведомляеткоторый перезагружает связанную службу.
Однако связанная служба управляется в основном рецепте. В настоящее время это не удается, поскольку он жалуется на отсутствие службы.
В предыдущих версиях при использовании LWRP это было вызвано использованиемиспользование_встроенных_ресурсов, и я считаю, что вы могли бы обойти эту конкретную проблему, НЕ включая эту функцию в свой LWRP.
Теперь я НЕ включаю эту строку в свой пользовательский ресурс, но поведение присутствует. Есть ли способ отключить это поведение?
Или есть ли другой способ «включить» службу в несколько ресурсов, чтобы мне не приходилось иметь один и тот же код во многих местах?
решение1
Основываясь на ответе delerious010, мы с коллегой смогли придумать более удачный выход из этой конкретной ситуации:
action :create do
global_nginx = resources('service[nginx]')
template "/etc/nginx/conf.d/#{name.tr(' ', '_')}.conf" do
cookbook 'nginx_server'
source 'server_block.conf.erb'
owner 'root'
group 'root'
mode '0644'
variables(
listen: listen,
server_name: real_server_name,
root: root,
index: index,
config: config
)
notifies :reload, global_nginx, :delayed
end
end
Очевидно, что в этом примере управляется только один ресурс, но вы можете иметь несколько ресурсов и уведомлять только о тех, которые вам нужны.
EDIT: Обратите внимание, что это основано на ошибке (https://github.com/chef/chef/issues/4669), которые исправят разработчики Chef. Поскольку в 12.9.38 поиски в коллекции ресурсов были сделаны рекурсивными вверх к внешним run_contexts, этот код все еще будет работать, но больше не будет необходим (и будет правильно обрабатывать множественные вложенные подконтексты, где вам нужно захватить ресурс в корне, а не только родительский run_context). Лучшим решением здесь должно быть просто обновление.
решение2
В Chef 12.5 use_inline_resources включен по умолчанию. Это приводит к тому, что при каждом обновлении подресурса LWRP будет помечен как изменившийся. Таким образом, вы всегда можете определить уведомление о ресурсе в «родительском» LWRP.
Или, если вы хотите, чтобы пункт уведомлений был определен для всех экземпляров вашего LWRP, вы всегда можете создать уведомление непосредственно в блоке действий:
notifies_delayed(:restart, resources("service[rsyslog]"))
Однако имейте в виду, чтолюбойресурс, измененный в вашем LWRP, приведет к перезапуску службы. Хотя, возможно, можно использовать вызов ресурсов для определения notifies
свойства дочернего ресурса. Не совсем уверен, так как я еще не проверял это.
решение3
В версии 12.9.38 добавлена возможность отправки уведомлений от поставщика sub-resource-collection / use_inline_resources внешнему resource_collection:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
Теперь это поведение уведомлений по умолчанию, поэтому вам нужно будет только обновиться.