Chef infra 厨师有条件停止服务

Chef infra 厨师有条件停止服务,chef-infra,Chef Infra,我有两个食谱 web::foo web::bar 酒吧有服务,我们会打电话给buzz 如何在foo cookbook中实现条件依赖性,以便 如果bar::service[buzz]正在运行,它将停止 如果bar::service[buzz]未运行,则跳过通知 像这样的东西应该有用 web::foo powershell "do stuff" do code "echo derp" notifies :stop "service[buzz]" if node.run_list?('re

我有两个食谱

web::foo web::bar

酒吧有服务,我们会打电话给buzz

如何在foo cookbook中实现条件依赖性,以便

  • 如果bar::service[buzz]正在运行,它将停止
  • 如果bar::service[buzz]未运行,则跳过通知
像这样的东西应该有用

web::foo

powershell "do stuff" do
  code "echo derp"
  notifies :stop "service[buzz]" if node.run_list?('recipe[web::bar]')
end
但是,这仅在包含配方的情况下停止buzz服务。它的副作用是,如果buzz服务存在,但尚未启动,它将失败

如果定义了服务,那么停止服务的最佳方式是什么

使用此语法

if node['recipes'].include?('bar::buzz')
(食谱名称前必须有食谱名称
栏::

管理buzz的服务需要本质上是幂等的,这样,如果该服务没有运行,并且它无论如何都试图停止它,它仍然会干净地退出

感谢IRC中的coderanger澄清了这一点


使用node['recipes']存在风险。事情可能已经发生了变化,但上一次我看到的只是扩展的run_列表中包含的食谱。由于
include\u recipe
语句,它没有包含任何运行的配方。在您的用例中,这可能是可以的,但我想我应该指出这一点。另外-您是否考虑过使用
status\u命令
来查询它?status_command参数允许您在调用
服务时指定任意命令。您可以将其存储在一个变量中,以便进行if检查或类似操作