如何延迟在厨师食谱中执行搜索机制直到运行时间。
我想确保以下代码的执行延迟到运行时。
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块,但它没有帮助我。
答案 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