检查是否已安装服务

时间:2015-04-17 11:51:41

标签: service chef

如何检查节点上是否安装了服务(debian和cent os / amazon)?

如果已安装,我想停止并禁用该服务。如果服务不存在,我会在服务停止时收到异常: Chef :: Exceptions :: Service:/etc/init.d/service不存在!

祝你好运 安德烈

4 个答案:

答案 0 :(得分:5)

一种解决方案是在服务资源中添加guard

service "my_service" do
  action :stop,:disable
  only_if { File.exist?("/etc/init.d/my_service") }
end

另一个是保护资源本身的定义: 免责声明:这是此示例的未经测试的代码。

service "my_service" do 
  action :stop,:disable
end.if File.exist?("/etc/init.d/my_service")

和最后一个更直观的

if File.exist?("/etc/init.d/my_service")
  service "my_service" do 
      action :stop,:disable
  end
end

第一个示例与其他示例之间的主要区别在于,第一个示例将在编译时将资源添加到集合中,而另一个仅在文件存在的情况下才会向集合添加资源,因此如果不是这样,您将避免使用此服务的新对象那里。

精确,最后两个解决方案有一点缺点,如果另一个配方安装服务,他们将不会在第一时间看到它,因为编译配方时文件不存在,所以你可能最终运行服务直到下一次大厨。

答案 1 :(得分:1)

用它来检查

only_if { ::File.exist?("/etc/init.d/my_service") }

答案 2 :(得分:1)

要扩展和更新现有的答案,请执行以下操作:如果您使用的是systemd,您仍然可以在保护程序中检查文件,但它们的位置会稍有不同。

您要检查/ usr / lib / systemd / system中是否存在名为“ servicename.service”的文件(例如telnet.service,named.service等)

在资源中添加一个only_if语句,您真是天生的!

示例:

service "service_name" do
  action :stop
  only_if { File.exist?("/usr/lib/systemd/system/service_name.service") }
end

答案 3 :(得分:0)

不要忘记:Systemd改变了世界,包括您的服务规范位置。它不再只是一个可预测的文件名,而应该存在于/ usr / lib / systemd下的某个位置。如果您的系统使用systemd并且您的File.exist?()检查无效,请确保您正在查找正确的新位置。