2017-06-05 207 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

相關問題