厨师 - 在测试厨房环境中搜索

时间:2017-06-05 00:09:28

标签: chef test-kitchen

我正在管理一些只能在一台服务器上运行的脚本。我已经决定挑选一个分配给给定角色的主机的最佳方法是进行搜索,然后选择返回的数组中的第一个元素。

像这样:

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'

1 个答案:

答案 0 :(得分:1)

潜在的问题可能是您没有正确设置夹具节点数据,或者某些部分搜索API在Zero下无法正常工作。然而,这主要是没有实际意义,因为这种服务器选举方法是不安全的,你不应该使用它。至少你需要以某种方式对返回的数组进行排序,因为Chef中的搜索结果对任何外部参考点都不稳定(它在名为&#34的字段上排序;对象ID"但这不在API中公开)。更重要的是,这很容易导致服务器降级,但直到下次Chef运行时才实现。取决于你对#34的认真程度,只能在一个地方运行"规则你要么在Chef方面需要一些稍微坚固的代码,要么更好地使用实际为集群协调设计的工具,如Consul,ZooKeeper或Etcd。