Я пишу кулинарную книгу, в которой используются пользовательские ресурсы, представленные в Chef 12.5. У меня есть настраиваемый ресурс, который использует ресурс шаблона и поэтому имеет уведомляет который перезагружает связанную службу.
Однако связанная услуга управляется в основном рецепте. В настоящее время это не удается, поскольку он жалуется, что нет службы.
В предыдущих версиях при использовании LWRP это было вызвано использованием use_inline_resources, и я считаю, что вы можете обойти эту конкретную проблему, НЕ включив эту функцию в свой LWRP.
Теперь я НЕ включаю эту строку в свой пользовательский ресурс, но поведение присутствует. Есть ли способ отключить это поведение?
В качестве альтернативы, есть ли другой способ «включить» службу в несколько ресурсов, чтобы мне не приходилось иметь один и тот же код во многих местах?
Основываясь на ответе 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
Очевидно, что в этом примере управляется только один ресурс, но он должен позволить вам иметь несколько ресурсов и уведомлять только о тех, которые вы хотите.
РЕДАКТИРОВАТЬ: обратите внимание, что это связано с ошибкой (https://github.com/chef/chef/issues/4669), что исправят разработчики Chef. Поскольку в 12.9.38 поиск в коллекции ресурсов выполнялся с рекурсивным переходом вверх к внешним run_contexts, этот код по-прежнему будет работать, но больше не будет необходим (и будет правильно обрабатывать многократно вложенные подконтексты, когда вам нужно захватить ресурс в корне, а не просто родительский run_context). Лучшим решением здесь должно быть просто обновление.
В Chef 12.5 use_inline_resources включен по умолчанию. Это приводит к тому, что всякий раз, когда подресурс обновляется, LWRP будет помечен как измененный. Таким образом, вы всегда можете определить уведомление о ресурсах на «родительском» LWRP.
Или, если вы хотите, чтобы предложение notifies было определено для всех экземпляров вашего LWRP, вы всегда можете создать уведомление прямо в блоке действий:
notifies_delayed(:restart, resources("service[rsyslog]"))
Однако имейте в виду, что любой изменение ресурса в вашем LWRP приведет к перезапуску службы. Хотя можно использовать вызов ресурсов для определения notifies
свойство на дочернем ресурсе. Не совсем уверен, так как еще не тестировал это.
В 12.9.38 возможность уведомления от поставщика sub-resource-collection / use_inline_resources во внешнюю resource_collection была добавлена:
https://github.com/chef/chef/commit/0ca27b6f30ccd327505bd3a44bd319fb3eba956b
Теперь это поведение уведомлений по умолчанию, поэтому вам нужно только обновить.