【问题标题】:Chef conditionally stop service厨师有条件停止服务
【发布时间】:2015-07-07 08:08:05
【问题描述】:

我有两个食谱。

web::foo 网页::栏

bar有服务,我们会叫buzz

如何在 foo 食谱中进行条件依赖。

  • 如果 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服务存在,但还没有启动,它会失败。

如果已定义,仅停止服务的最佳方法是什么?

【问题讨论】:

  • 另外——你考虑过使用status_command 来查询吗? status_command 参数允许您在调用service 时指定您喜欢的任意命令。您可以将其存储在一个变量中以供您的 if 检查或类似的东西

标签: chef-infra


【解决方案1】:

使用此语法。

if node['recipes'].include?('bar::buzz')

(食谱名称buzz前面必须有食谱名称bar::

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

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

https://gist.github.com/kwilczynski/c271f251ea7f48ba99b3

【讨论】:

  • 使用 node['recipes'] 存在风险。事情可能发生了变化,但最后我查看了扩展的 run_list 中只包含食谱。它确实包括由于include_recipe 语句而运行的任何配方。这可能在您的用例中没问题,但我想我会指出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多