Chef infra 资源的有条件执行

Chef infra 资源的有条件执行,chef-infra,conditional-statements,chain,Chef Infra,Conditional Statements,Chain,我在一本发出HTTP请求的食谱中定义了以下2个资源。我基本上需要根据操作1的结果检查一个条件来执行操作2。如果action 1中的条件不匹配,我需要让食谱休眠一段时间,然后再次尝试action 1 最好的方法是什么 webhooks_request "Action 1" do uri "example.net/data1" post_data ({ 'value1' => '1', 'value2' => '2'}) expected_response_codes

我在一本发出HTTP请求的食谱中定义了以下2个资源。我基本上需要根据
操作1
的结果检查一个条件来执行
操作2
。如果
action 1
中的条件不匹配,我需要让食谱休眠一段时间,然后再次尝试
action 1

最好的方法是什么

webhooks_request "Action 1" do
   uri "example.net/data1"
   post_data ({ 'value1' => '1', 'value2' => '2'})
   expected_response_codes [ 200, 201 ]
   action :post
end
我正在使用下面的
ruby_块
来处理
操作1
的结果,因此我认为应该可以在匹配a条件的基础上执行
操作2

ruby_block "Parse Response" do
   #Parse the result from action 1
end

webhooks_request "Action 2" do
   uri "example.net/data2"
   post_data ({ 'value1' => '1', 'value2' => '2'})
   expected_response_codes [ 200, 201 ]
   action :post
end
我会做什么(警告:这是未经测试的代码):

另一种方法是在ruby块内执行“Action1”调用,直接解析其输出

大致可以做些什么(尚未测试的代码):


非常感谢-我要试试这个。\n我想补充一点,如果你想跳过#2 if#1次,那么把
not#if{node.runstate['my#u hook']['retries']<0}
(你可能也必须把它包装在一个
惰性
块中。@TejayCardon我可能错了(因为我没有测试过它),但我在块中的最后一行将返回true或false,IIRC(但确实不确定)如果ruby_块返回false,则不应触发通知(我必须对此进行测试以确认此行为)好的,这是官方有史以来最酷的想法,但从源代码来看,我不认为是这样。我一直希望有一种干净的方法来使用ruby_块,而不产生总是
更新的
资源。遗憾的是,如果我是对的,而且它们还没有这样做,那么添加它将是一个困难的特性,因为它将被破坏。L让我知道你是否在代码中看到了一些不同的东西。这个想法可能是
引发“异常”,除非hook\u retries>0
,如果第一个webhook之后再也没有返回可用的东西,那么整个运行就会失败。因为几乎可以肯定运行的其余部分无论如何都会有问题。
node.runstate['my_hook']['retries']=10

webhooks_request "Action 1" do
   uri "example.net/data1"
   post_data ({ 'value1' => '1', 'value2' => '2'})
   expected_response_codes [ 200, 201 ]
   action :post
   notifies :run, "ruby_block[Parse Response]", :immediately 
end

ruby_block "Parse Response" do
   action :nothing
   block do
     #Parse the result from action 1
     if "result ok from action 1"
       self.notifies :post,"webhooks_request[Action 2]",:immediately
     else
       node.runstate['my_hook']['retries'] -= 1 # decrease to avoid infinite loop
       sleep(10)
       self.notifies :post,"webhooks_request['Action 1']",:immediately
     end
   end
end

webhooks_request "Action 2" do
   uri "example.net/data2"
   post_data ({ 'value1' => '1', 'value2' => '2'})
   expected_response_codes [ 200, 201 ]
   action :nothing
end
ruby_block "try webhook" do
  block do
    r = Chef::Resource::WebhooksRequest.new('Action 1',run_context)
    r.uri "example.net/data2"
    r.post_data ({ 'value1' => '1', 'value2' => '2'})
    r.expected_response_codes [ 200, 201 ]
    hookretries=10 
    while hookretries do
      r.run_action :post
      # parse data from Action 1
      if "action 1 returned NOK"
         hookretries -= 1
      else 
         break
      end
    end
    hook_retries > 0 # to trigger notify if we're not in timeout
  end
  notifies :post, "webhooks_request[Action 2]", :immediately
end
webhooks_request "Action 2" do
   uri "example.net/data2"
   post_data ({ 'value1' => '1', 'value2' => '2'})
   expected_response_codes [ 200, 201 ]
   action :nothing
end