2014-02-07 13 views
1

我使用廚師安裝serf,然後我需要執行serf members -format=JSON。我的代碼如下所示:如何安裝程序然後在同一個Chef中運行它?

include_recipe "mycookbook::serf" 
log `serf members -format=json` 

但是,沒有東西打印到日誌。重新運行主廚運行(安裝serf後)會在日誌中生成JSON輸出。

爲什麼第一次沒有得到信息?在調用serf members之前,我們如何確保程序已安裝?

回答

1

搞清楚代碼在Chef中被評估的時間可能有點棘手。這是一個多通道的過程。第一名廚師評估其運行列表中的所有食譜,以構建要做的事情列表。如果你寫「生紅寶石」,它會在這個階段被評估。

因此,在您的情況下,當您運行shell時,serf二進制文件還不可用。

有幾種方法可以解決這個問題,最簡單的方法是將serf命令放在主廚運行結束時的報告處理程序中。

http://docs.opscode.com/handlers.html

如果你需要在運行期間對農奴的結果,你需要指定運行農奴命令是依賴於資源。最簡單的方法是將serf命令放入ruby_block資源中。

http://docs.opscode.com/resource_ruby_block.html

這確保了紅寶石將初始通之後經過與農奴後安裝食譜執行。

+0

這工作,但後來我在不同的上下文訪問變量的問題。很明顯,'ruby_block'中的變量只是塊本身的本地變量? –

+0

我很確定情況並非如此。你可以發佈代碼嗎? –

1

您希望把它放在一個ruby_block

include_recipe "mycookbook::serf" 
ruby_block do 
    block do 
    Chef::Log.info `serf members -format=json` 
    end 
end 
相關問題