Chef - 在测试厨房上下文中搜索

Chef - Search within test kitchen context

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

像这样:

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 和 vagrant 驱动程序。是否必须执行任何特殊操作才能让搜索功能在这种情况下发挥作用?

积分json:

{
  "id": "thumper",
  "environment": "food",
  "run_list": ["role["thumper]"],
  "automatic": {
    "fqdn": "thumper",
    "ipaddress": "10.10.10.10",
    "roles": ["thumper"],
    "environment": "food"
  }
}

Fixtures数据只是调用相关的cookbooks

include_recipe 'test_helpers'
include_recipe 'role_thumper'

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