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

时间:2014-10-10 15:27:02

标签: chef upstart

我正在尝试编写一个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

的删除

有什么想法?感谢信。

1 个答案:

答案 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方法将抛出错误,因此您可能希望将其包装在某些错误控制逻辑中。