首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在包含LWRP配方中定义的通知服务

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

Stack Overflow用户
提问于 2014-09-11 16:14:56
回答 2查看 4.6K关注 0票数 4

是否有一种通知服务重新启动的方法,该服务由包含的LWRP定义?

我写了一个名为"sidekiq“的LWRP,它像这样建立了一个服务,并且看起来很好。

代码语言:javascript
复制
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中定义的服务。我现在有一些东西

代码语言:javascript
复制
include_recipe "sidekiq"
deploy_revision my_dir do
  notifies :restart, "service[myapp_sidekiq]"
end

问题是在编译时,厨师看了看这个菜谱,并给出了一个错误。

错误:资源deploy_revisionmy_dir配置为在重新启动操作时通知资源servicemyapp_sidekiq,但是在资源集合中找不到servicemyapp_sidekiq。

我可以通过在部署配方中定义一个空服务(如service 'myapp_sidekiq' )来消除错误,并且在第一次配置机器时一切都会正常工作。但是,如果我运行部署,而没有任何改变,myapp_sidekiq服务永远不会被重新定义,因此不能重新启动。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 08:49:57

通知一个资源来完成一个操作,必须在当前主厨运行之前定义该资源,正如Tensibai指出的,它自己的run_context中没有定义该资源

位置保持架

简单的方法是在您的非默认提供程序的部署脚本中创建一个具有:nothing操作的位置持有者,但是您可以在以后通知它。

代码语言:javascript
复制
service "myapp_sidekiq deploy notifier" do
  provider      Chef::Provider::Service::Upstart
  service_name  "myapp_sidekiq"
  action        :nothing
end

如果您总是在主厨配置为其他工具的平台上使用Upstart,您还可以修改client.rb中资源的总体默认提供程序,比如systemd

代码语言:javascript
复制
Chef::Platform.set :platform => :yours, :resource => :service, :provider => Chef::Provider::Service::Upstart

有一些大厨的变动. 12可以让Chef评估在运行时使用哪个服务提供者,而不是静态配置。这主要是因为系统的出现和改变系统上的东西曾经是非常稳定和可预测的。

请注意用于资源的name。如果您有多个通过相同服务名称定义的service资源,您可能会遇到问题,因为它们是以厨师把他们当作克隆人的方式运行的,而且您可能正在运行一些您没有预料到的事情。如果您正在使用多个服务定义,请尝试将它们命名为特定用途的唯一定义。然后在属性中,使用service_name指定服务

LWRP

如果您有一个非常复杂的资源重复定义,并且您认为应该只为它指定所有泛型参数一次,那么您可以创建自己的轻量化资源及供应商,封装所有泛型设置,以便在菜谱中更容易地定义资源:

代码语言:javascript
复制
service_myapp_sidekiq "deploy notifier" do
  action      :nothing
end

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

这是大量的工作,因为您必须为您想要支持的每个底层操作创建一个LWRP action,正如您所看到的,这并不能使您的用例变得更容易。

图书馆功能

您还可以在图书馆中使用定义资源基础知识并允许您添加任何您想要的自定义(如名称)的函数来完成相同的任务。

代码语言:javascript
复制
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:定义一个place service,它为部署做:nothing

票数 4
EN

Stack Overflow用户

发布于 2014-09-12 08:14:51

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

没有内联资源标志的LWRP将它们的内部资源添加到资源集合中,但是在会聚阶段et没有在编译时添加,所以您仍然会看到所看到的错误。

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

我真的不明白您的意思,除非您的deploy_revision应该更改服务的启用/disbale状态,或者它支持什么(状态、重新启动、重新加载等等),否则没有必要重新启用它,只需要为deploy_revision定义一个服务资源来通知它重新启动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25792383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档