Chef infra 应用chef标记并直接使用搜索

Chef infra 应用chef标记并直接使用搜索,chef-infra,apache-zookeeper,Chef Infra,Apache Zookeeper,当前正在尝试与chef一起安装zookeeper集成。作为配置文件(zoo.cfg)的一部分,我们需要如下列出集合的服务器(该文件在集合的所有成员中的顺序必须相同) 因此,我认为通过搜索我标记为zookeeper服务器的节点来生成此列表可能非常好。我使用的语法是 zk_servers = search(:node, "tags:#{node[:zookeeper][:tag]} AND chef_environment:#{node.chef_environment}") 所以我的问题是,当我

当前正在尝试与chef一起安装zookeeper集成。作为配置文件(zoo.cfg)的一部分,我们需要如下列出集合的服务器(该文件在集合的所有成员中的顺序必须相同)

因此,我认为通过搜索我标记为zookeeper服务器的节点来生成此列表可能非常好。我使用的语法是

zk_servers = search(:node, "tags:#{node[:zookeeper][:tag]} AND chef_environment:#{node.chef_environment}")
所以我的问题是,当我安装并配置第一台服务器时,我没有得到任何结果,因为没有SOLR索引的标记节点。是否需要强制执行我在早期配方中应用的标记在同一次运行中进行索引和搜索

我可以操纵结果,但我更希望搜索结果更具动态性


Solr是否仅在运行完成且我们已报告结果时保存标记?

通常,在运行报告处理程序并完成运行之前,节点在其Chef运行期间收集的信息会在Chef运行结束时保存回服务器一次。因此,Chef服务器(及其搜索组件)只能在成功运行Chef后对数据进行索引

也就是说,您可以通过运行

node.save
在食谱中。但是,这可能还不够,因为数据的索引是异步的,并且在再次查询数据时可能无法完成。您可能需要等待一段时间才能完成索引(即,在循环中,查询服务器,如果包含当前节点,则继续,否则,等待几秒钟,然后重试)

由于这相当繁琐,一种常见的模式是像您那样搜索节点,然后使用当前节点“丰富”返回的数据(如果适用)。这可能看起来像这样:

zk_servers = search(:node, "tags:#{node[:zookeeper][:tag]} AND chef_environment:#{node.chef_environment}")
zk_servers << node if tagged?(node[:zookeeper][:tag]) && zk_servers.none?{|zk_server| zk_server.name == node.name}
zk_servers=search(:node,“标记:{node[:zookeer][:tag]}和chef_环境:{node.chef_环境}”)

zk_服务器非常有意义。我想消息传递队列的使用是它异步的原因,对吗?充实当前的结果肯定是我现在可以做的事情。谢谢你的帮助
zk_servers = search(:node, "tags:#{node[:zookeeper][:tag]} AND chef_environment:#{node.chef_environment}")
zk_servers << node if tagged?(node[:zookeeper][:tag]) && zk_servers.none?{|zk_server| zk_server.name == node.name}