Chef infra 资源的有条件执行
我在一本发出HTTP请求的食谱中定义了以下2个资源。我基本上需要根据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
操作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