如何检查节点上是否安装了服务(debian和cent os / amazon)?
如果已安装,我想停止并禁用该服务。如果服务不存在,我会在服务停止时收到异常: Chef :: Exceptions :: Service:/etc/init.d/service不存在!
祝你好运 安德烈
答案 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?()检查无效,请确保您正在查找正确的新位置。