如果Windows服务正在运行,我可以使用卫兵厨师吗?

时间:2016-11-09 16:18:29

标签: ruby chef chef-recipe

我正在写一个厨师食谱,我只需要在服务不工作时执行操作(运行批处理)。 我使用这个片段:

batch 'run commnad' do
  cwd target_path + '/bin/win64'
    code 'command to be executed'
    not_if '::Win32::Service.exists?("Service name")'
end

但它似乎不起作用。在看到this问题之后,我使用if子句而不是后卫更改了该过程,并且它可以正常工作:

if !::Win32::Service.exists?("Service name") then
  batch 'Install zabbix agent' do
    cwd target_path + '/bin/win64'
    code 'command to be executed'
  end
end

但是,根据我的理解,这不应该是管理这个的正确方法,所以我想知道:为什么警卫不能正常工作?

谢谢, 米歇尔。

2 个答案:

答案 0 :(得分:4)

您编写not_if语句的方式将命令作为shell脚本运行。 shell不知道Ruby代码,因此整个命令都会失败。

为了将not_if与Ruby代码一起使用,你应该把它放在一个块中:

not_if { Win32::Service.exists?("Service name") }

在此处查看更多示例(在页面上搜索not_if):
https://docs.chef.io/resource_common.html

答案 1 :(得分:0)

这是工作示例(13号厨师)

   require 'win32/service'
   windows_service "jenkins" do
      action [:stop, :disable]
      only_if { ::Win32::Service.exists?("jenkins")}
   end