如何在CHEF中为资源块的操作添加条件?

时间:2018-11-22 11:12:11

标签: ruby chef chef-recipe chef-solo cookbook

我创建了一个具有两项操作的资源。

让我们说一下动作:A1和动作:A2。 我可以像这样在单个资源块(测试)中调用它们:

test 'Testing the actions' do
    action [:a1 ,:a2]
    only_if {::File.exists?"/tmp/action_exist.txt"}
end

它工作正常。但是,如果我想在这样的动作上添加条件,该怎么办

  

仅检查动作:A1的条件。并简单地执行action:A2而不考虑条件。

我尝试过这样:

test 'Testing the actions' do
    action [:A1 ,:A2]
    if (action.first=="A1")
            puts "yes"
            only_if {::File.exists?"/tmp/action_exist.txt" }
    end

结束

但是它不起作用。 这两个动作都在执行此条件

2 个答案:

答案 0 :(得分:0)

这不是Chef的工作方式。资源主体不是运行每个动作的脚本。

答案 1 :(得分:0)

这取决于在编译时是否知道条件。如果在编译时知道该条件,则可以编写如下内容:

test 'Testing the action' do
  if ::File.exists?('/tmp/action_exist.txt')
    action [:A1, :A2]
  else
    action [:A2]
  end
end

但是,如果您的食谱在运行过程中没有摆弄/tmp/action_exist.txt,则只能 。如果/tmp/action_exist.txt的状态在收敛期间可能发生变化,那么您可能需要做一些更奇特的事情。例如,您可以通知资源在资源之前的某个资源中立即执行:A1。那不是我要做的,所以您可能需要试验。