2014-10-10 24 views
0

我想编写一个新贵脚本来管理New Relic系统监视插件(默认使用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不存在?

所以我的问题是,为什么厨师试图重新启动服务后,我告诉它停止。此外,我期待service "newrelic-sysmond"完成并通知文件资源,然后完成删除/etc/init.d/newrelic-sysmond

任何想法?谢谢。

回答

1

三件事。前两个只是清理你的代码,第三个应该解决你的问题。

首先,:start => true:stop => true是不相关的。 supports仅对:restart:status:reload感兴趣。

其次,您需要not_if在您的service资源。否则,当它尝试:stop init.d服务并且无法找到该文件时,第二次运行此Cookbook时会发生错误。

service 'newreslic-sysmond' do 
    supports :status => true, :restart => true 
    action :stop 
    notifies :delete, 'file[/etc/init.d/newrelic-sysmod]', :delayed 
end 

第三,安装newrelic-sysmond服务的食谱也可能会通知资源在某处重新启动。你可以用几个来处理,从最漂亮到最丑。

阻止从不断被创造

其中被摆在首位创建service资源的服务。如果你能搞清楚,你可能能够阻止它。 (如果您向我们提供更多信息,我们可以提供帮助)

直到重新启动后才能删除文件。

不利的一面是你会开始,停止和删除init.d脚本,每个厨师都可以运行,但你可以做到。只需通知您删除文件:delayed通知。只要它迟于延迟通知堆栈,而不是您的restart,那么您就是金。这有点脆弱,因为运行列表中的更改可能会破坏它。

修改通知栈

注意:此代码是未经测试,但应接近,随意编辑响应,如果我没有得到它完全正确

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 

如果你走这条路由,您可能还需要修改资源堆栈本身,以确保永远不会执行service资源。否则,你仍然会回到每个厨师跑步可能导致一次又一次地创建和移除的情况。此外,resources方法将在资源未找到时抛出错误,因此您可能想要将其包含在一些错误控制逻辑中。