2012-10-11 51 views
3

當調試廚師食譜中的錯誤時,我通常喜歡登錄到有問題的機器,輸入「shef -z」。在以前成功運行的情況下,已註冊的run_list會自動加載所有相關的屬性和配方,以便我可以直接跳到嘗試有問題​​的線路。是否可以在shef(chef shell)客戶端模式下強制run_list加載

問題是如果chef-client在第一次運行時失敗,那麼run_list是空的,並且shef甚至從緩存中刪除了「它的食譜不再需要在此客戶端上」的(非常需要的)食譜。有沒有辦法強制shef讓我使用我的run_list?

官方的wiki mentions:

「運行列表會以同樣的方式作爲普通廚師客戶 運行進行設置。」

但嘗試「-j」似乎沒有幫助。

我也嘗試運行獨奏模式(「-s -j」),如blog post中所述。它加載run_list(而不展開,這是奇怪的),但是當我嘗試做任何事情,我得到的東西,如:

「食譜的tomcat沒有發現如果你從另一個 食譜裝載的tomcat,確保你在你的元數據中配置依賴項「。

請注意,我的食譜有3個深度的幾十個依賴關係,因此將所有代碼手動粘貼到shef並不是真正的選擇。我目前的解決方法是上傳一個修改後的配方,註釋掉所有可能有問題的部分(並從那裏手動繼續),但我希望有一個更好的選擇。

+1

我想它不會在獨奏模式下擴展運行列表,因爲運行列表擴展是Chef Server API接口的一部分(請參閱/ environments下的cookbook_versions POST),並且需要一些依賴解決代碼,這些代碼可能不適用於廚師獨奏。 –

回答

2

食譜不包括默認,當你開始在客戶端或獨奏模式SHEF,因爲SHEF的使用情況,以確定爲什麼配方可能不被加載在所有的,如編譯時間錯誤導致一些異常。

因此,您需要使用include_recipe來包含您希望使用的配方。您可以爲所有的角色/在節點的運行列表食譜自動執行此操作:

node.run_list.expand(node.chef_environment).recipes.each do |r| 
    include_recipe r 
end 

有關的更多信息,以及使用SHEF調試廚師客戶端運行了一堆其他偉大的提示,請參閱Steven Danna's blog post

+0

謝謝,這是一篇很棒的文章。 首先嚐試,我仍然得到了「Cookbook xyz not found」錯誤,因爲運行列表尚未爲此節點填充,但後來我重新讀取了「_我們只能在Shef下載的食譜上使用include_recipe up_「然後它打我。 我用'knife node run_list add'手動加載run_list,然後運行'shef -z'運行良好,無需在json中傳遞run_list。 – yoniLavi

+1

需要爲主廚獨奏使用'node.run_list.expand(node.environment,'disk')' – omribahumi

0

當Chef首次運行時,它會創建/etc/chef/first-boot.json文件,並在其中運行列表。試試運行:

shef -z -j /etc/chef/first-boot.json 
+0

不,正如我上面提到的,這不會爲我加載任何東西(但在「-s」模式下部分工作)。 萬一它很重要,我現在使用版本10.12.0,但我也記得其他版本的這種行爲。對你起作用嗎? – yoniLavi

相關問題