2017-06-05 137 views
1

我正在管理一些只能在一台服务器上运行的脚本。我已经决定选出一个分配给给定角色的主机的最佳方法是通过搜索然后选择返回的数组中的第一个元素。厨师 - 在测试厨房内搜索

像这样:

q = "roles:thumper" 
arr = search(:node, q, filter_result: { fqdn: ['fqdn'] }).map { |n| n['fqdn'] } 

# => ["1.example", "2.example"] 

arr.first 
# "1.example" 

这种运作良好,在现实和厨师壳,但在那里我被对搜索命令返回一个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

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

+0

上面的示例代码略显过于简化,实际上它有一些外部排序和基本的完整性检查。好的电话,但。 与Kubernetes合作编排将在2周内成为我的一个大型黑客马拉松项目,我会在尝试将这种类型的服务整合到服务发现中。同时,尽管我一般希望能够在TK中使用搜索(不是部分搜索)。你在夹具节点数据中提到什么?我将把我的json放在原始问题中 –

+0

您需要为测试实例提供一个Node对象作为JSON文件夹,就像您在那里一样,但它会在'test/integration/nodes'中进行,除非您覆盖Kitchen配置中的文件夹。作为创建过程的一部分,它将被发送到虚拟机。 – coderanger

相关问题