通知在包含的LWRP配方中定义的服务

时间:2014-09-11 16:14:56

标签: chef chef-recipe

有没有办法通知服务重启,这是由包含的LWRP定义的?

我写了一个名为" sidekiq"的LWRP。这样就建立了一种服务,并且看起来工作正常。

service "#{new_resource.name}_sidekiq" do
  provider Chef::Provider::Service::Upstart
  action [ :enable ]
  subscribes :restart, "template[/etc/init/#{new_resource.name}_sidekiq.conf]", :immediately
end

问题是我正在使用它用于部署的另一个配方,并且需要它来通知LWRP中定义的服务。我现在有这个东西

include_recipe "sidekiq"
deploy_revision my_dir do
  notifies :restart, "service[myapp_sidekiq]"
end

问题是在编译时,厨师看着这个食谱并给出错误

  

错误:资源deploy_revision [my_dir]配置为通过重新启动操作通知资源服务[myapp_sidekiq],但在资源集合中找不到服务[myapp_sidekiq]。

我可以通过在我的部署配方中定义一个空服务来消除错误,例如service 'myapp_sidekiq',并且在首次配置机器时一切正常。但是,如果我运行部署并且sidekiq LWRP没有任何更改,则myapp_sidekiq服务永远不会重新定义,因此无法重新启动。

2 个答案:

答案 0 :(得分:4)

notify资源完成操作,必须先在当前Chef运行中定义该资源,并且Tensibai注释中未定义inline其自身run_context }

占位符

简单的方法是在非默认提供程序的部署脚本中创建一个占位符,其行为为:nothing,但您可以稍后通知它。

service "myapp_sidekiq deploy notifier" do
  provider      Chef::Provider::Service::Upstart
  service_name  "myapp_sidekiq"
  action        :nothing
end

如果您在Chef已配置为其他内容的平台上始终使用Upstart,则还可以修改client.rb中资源的整体默认提供程序,例如systemd

Chef::Platform.set :platform => :yours, :resource => :service, :provider => Chef::Provider::Service::Upstart

changes coming in Chef 12可让Chef评估在运行时使用哪个服务提供商而不是静态配置。这基本上是由于系统出现并在曾经非常稳定和可预测的系统上发生变化。

请注意您用于资源的name。如果您通过相同的服务名称定义了多个service资源,则可能因问题Chef treats them as clones而遇到问题,并且您可能正在运行您并不期望的事情。如果您使用多个服务定义,请尝试将它们命名为特定用途的唯一内容。然后在属性中,使用service_name

指定服务

LWRP

如果你有一个特别复杂的资源,你反复定义,并且你认为你应该只为它指定一次所有通用参数,你可以创建自己的Light Weight Resource and Provider封装所有通用设置,这样你就可以定义食谱中的资源更容易:

service_myapp_sidekiq "deploy notifier" do
  action      :nothing
end

service_myapp_sidekiq "config subscriber" do
  action      :nothing
  subscribes  :restart, 'blah'
end

这是很多工作,因为您必须为要支持的每个基础操作创建LWRP action,并且您可以看到,不会使您的用例更容易。

库函数

您还可以使用library中的函数执行相同的操作,该函数定义资源的基础知识,并允许您添加所需的任何自定义(如名称)。

def create_myapp_service name, action, options = {}
  s = Chef::Resource::Service.new "myapp service #{name}"
  s. service_name   "myapp_sidekiq"
  s.provider        Chef::Provider::Service::Upstart
  s.action          action
end

create_myapp_service "deploy", :nothing

同样,这些可能只需要更复杂的资源设置以及您需要定义相同复杂资源并且变化较小的情况。

TLDR :为部署确定service的占位符:nothing

答案 1 :(得分:1)

use_inline_resources的LWRP使用自己的run_context,因此LWRP内的资源不包含在resource_collection中,并且无法在LWRP之外得到通知。

没有内联资源标志的LWRP将其内部资源添加到资源集合中,但是在汇聚阶段而不是在编译阶段,因此您仍然会遇到错误。

  

但是,如果我运行部署并且sidekiq LWRP没有任何变化,   myapp_sidekiq服务永远不会重新定义,因此不能   重新启动。

我真的不明白你的意思,除非你的deploy_revision应该改变服务的启用/解除状态或它支持的状态(状态,重启,重载等),不需要重新启用它,只需为deploy_revision定义一个服务资源,通知它重新启动。