我正在管理一些只能在一台服务器上运行的脚本。我已经决定挑选一个分配给给定角色的主机的最佳方法是进行搜索,然后选择返回的数组中的第一个元素。
像这样:
q = "roles:thumper"
arr = search(:node, q, filter_result: { fqdn: ['fqdn'] }).map { |n| n['fqdn'] }
# => ["1.example", "2.example"]
arr.first
# "1.example"
这在现实和chef-shell中运行良好,但在Test Kitchen中遇到困难,我在搜索命令中返回HTTP 500.
================================================================================
Recipe Compile Error in /tmp/kitchen/cache/cookbooks/test/recipes/full.rb
================================================================================
Net::HTTPFatalError
-------------------
500 "Internal Server Error"
我正在使用chef_zero和流浪汉司机。为了让搜索功能在这种情况下有效,还有什么特别之处吗?
整合json:
{
"id": "thumper",
"environment": "food",
"run_list": ["role["thumper]"],
"automatic": {
"fqdn": "thumper",
"ipaddress": "10.10.10.10",
"roles": ["thumper"],
"environment": "food"
}
}
灯具数据只是调用相关的食谱
include_recipe 'test_helpers'
include_recipe 'role_thumper'
答案 0 :(得分:1)
潜在的问题可能是您没有正确设置夹具节点数据,或者某些部分搜索API在Zero下无法正常工作。然而,这主要是没有实际意义,因为这种服务器选举方法是不安全的,你不应该使用它。至少你需要以某种方式对返回的数组进行排序,因为Chef中的搜索结果对任何外部参考点都不稳定(它在名为&#34的字段上排序;对象ID"但这不在API中公开)。更重要的是,这很容易导致服务器降级,但直到下次Chef运行时才实现。取决于你对#34的认真程度,只能在一个地方运行"规则你要么在Chef方面需要一些稍微坚固的代码,要么更好地使用实际为集群协调设计的工具,如Consul,ZooKeeper或Etcd。