![Пользовательские ресурсы Chef 12.5 — доступ к ресурсам в рецептах](https://rvso.com/image/668776/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5%20%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B%20Chef%2012.5%20%E2%80%94%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0%D0%BC%20%D0%B2%20%D1%80%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D0%B0%D1%85.png)
Я пишу кулинарную книгу, которая использует пользовательские ресурсы, представленные в 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
Теперь это поведение уведомлений по умолчанию, поэтому вам нужно будет только обновиться.