Назад | Перейти на главную страницу

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

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

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