我正在尝试编写一个upstart脚本来管理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
有什么想法?感谢信。
答案 0 :(得分:1)
三件事。前两个只是为了清理你的代码,第三个应该解决你的问题。
首先,:start => true
和:stop => true
无关。 supports
仅对:restart
,:status
和:reload
感兴趣。
其次,您的not_if
资源需要service
。否则,当这本食谱第二次尝试:stop
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可能也会通知资源在某处重启。你可以处理几个,从最漂亮的到最丑的。
如果您可以找出首先创建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
方法将抛出错误,因此您可能希望将其包装在某些错误控制逻辑中。