Chef infra Chef错误-停止服务,删除与该服务相关的文件

Chef infra Chef错误-停止服务,删除与该服务相关的文件,chef-infra,upstart,Chef Infra,Upstart,我正在尝试编写一个upstart脚本来管理NewRelic系统监控插件(默认情况下使用init.d脚本) 我不希望这样,因为如果newrelic sysmond守护进程失败,那么我将不得不手动重新启动服务,这并不理想。另外,我一般更喜欢暴发户 以下是我的两个资源,它们来自我的食谱 file "/etc/init.d/newrelic-sysmond" do action :nothing end service "newrelic-sysmond" do supports :statu

我正在尝试编写一个upstart脚本来管理NewRelic系统监控插件(默认情况下使用init.d脚本)

我不希望这样,因为如果newrelic sysmond守护进程失败,那么我将不得不手动重新启动服务,这并不理想。另外,我一般更喜欢暴发户

以下是我的两个资源,它们来自我的食谱

file "/etc/init.d/newrelic-sysmond" do
  action :nothing
end

service "newrelic-sysmond" do
  supports :status => true, :start => true, :stop => true, :restart => true
  action :stop
  notifies :delete, 'file[/etc/init.d/newrelic-sysmond]', :immediately
end
现在,当我运行这个配方时,我得到一个奇怪的错误,告诉我newrelic sysmond服务无法重新启动,因为
/etc/init.d/newrelic sysmond
不存在

所以我的问题是,为什么在我告诉chef停止服务后,chef还要尝试重新启动服务。而且,我还希望
服务“newrelic sysmond”
完成并通知文件资源,然后完成对
/etc/init.d/newrelic sysmond
的删除


有什么想法吗?谢谢。有三件事。前两个只是稍微清理一下代码,第三个应该可以解决问题

首先,
:start=>true
:stop=>true
不相关<代码>支持仅对
:重新启动
:状态
、和
:重新加载
感兴趣

其次,您需要在
服务
资源上使用
not\u if
。否则,当本cookbook第二次运行时,当它尝试
:停止init.d服务并且找不到该文件时,将出现错误

service 'newreslic-sysmond' do
  supports :status => true, :restart => true
  action :stop
  notifies :delete, 'file[/etc/init.d/newrelic-sysmod]', :delayed
end
第三,安装newrelic sysmond服务的cookbook可能也在通知资源在某处重新启动。你可以用几种方法来处理这个问题,从最漂亮到最丑

阻止创建该服务 如果您能够首先找出
服务
资源的创建位置,您就可以阻止它。(如果您提供更多信息,我们可以提供帮助)

在重新启动之前不要删除该文件。 缺点是每次运行chef时都会启动、停止和删除init.d脚本,但您可以这样做。只需将删除文件的通知设置为
:delayed
通知。只要它在延迟通知堆栈中的时间晚于您的
重新启动时间,您就是黄金。这有点脆弱,因为运行列表中的更改可能会破坏它

修改通知堆栈 注意:此代码未经测试,但应该很接近,如果我没有完全正确,请随意编辑响应

ruby_block 'remove delayed restart on newrelic service' do
  block
    initd_resource = resources('service[newrelic-sysmond]')
    initd_notifications = initd_resource.delayed_notifications
    notification_collection = run_context.delayed_notification_collection
    initd_notifications.each{ |notif| notification_collection.delete(notif) }
  end
end
如果您这样做,您可能还需要修改资源堆栈本身,以确保永远不会执行
服务
资源。否则,您仍然会回到这样一种情况,即每一次chef运行都可能导致一次又一次地创建和删除。另外,如果找不到资源,
resources
方法将抛出一个错误,因此您可能希望将其封装在一些错误控制逻辑中