如何延迟厨师食谱中搜索机制的执行直到运行时间

时间:2014-12-23 18:50:42

标签: chef

如何延迟在厨师食谱中执行搜索机制直到运行时间。

我想确保以下代码的执行延迟到运行时。

node = search(:node, "chef_environment:#{node.chef_environment} AND (role:A)")
result = node[:hostname]

我有一个场景,其中上面的代码是配方的一部分,说'search_recipe',它位于三个角色'A','B','C'的运行列表中。

当角色B和C应用于节点时,'search_recipe'能够获取主机名,但是当它作为角色A的一部分运行时,它在编译时失败,因为在编译时没有可用角色的节点A,只有在配方执行开始后才会反映节点的角色。

我尝试过使用lazy和lambda块,但它没有帮助我。

1 个答案:

答案 0 :(得分:1)

搜索将永远不会在其第一次收敛时找到当前节点,因为节点数据在成功运行之后才会被发送回厨师服务器。您可以通过在适用时手动检查当前节点来解决此问题:

my_servers = []
search(:node,  "chef_environment:#{node.chef_environment} AND roles:A") do |n|
  my_servers << n['hostname']
end
if node['roles'].include?('A') && !my_servers.includes?(node['hostname'])
  my_servers << node['hostname']
end