Пользовательские ресурсы Chef 12.5 — доступ к ресурсам в рецептах

Пользовательские ресурсы Chef 12.5 — доступ к ресурсам в рецептах

Я пишу кулинарную книгу, которая использует пользовательские ресурсы, представленные в 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

Теперь это поведение уведомлений по умолчанию, поэтому вам нужно будет только обновиться.

Связанный контент