2012-12-10 45 views
5

我想通過chef_handler lwrp安裝一個廚師處理程序。這個處理程序(chef-handler-email)捆綁在一個gem中。我試圖安裝gem然後打開處理器從單一的配方,看起來像內:如何爲廚師處理程序安裝依賴關係?

chef_gem "chef-handler-mail" 

chef_handler "MailHandler" do 
    source 'chef/handler/mail' 
    arguments :to_address => "root" 
    action :nothing 
    supports :exception => true, :report => false 
end.run_action(:enable) 

如果已經安裝了寶石這工作得很好。但是,如果尚未安裝的寶石,我收到此錯誤:

[2012-12-09T20:47:56-05:00] FATAL: LoadError: chef_handler[MailHandler] (chef_handler::email line 13) had an error: LoadError: no such file to load -- chef/handler/mail.rb 

彷彿chef_handler資源正試圖chef_gem已執行並安裝了處理程序的寶石之前加載處理程序時出現。我明顯可以在兩步手動過程中做到這一點,我有一個單獨的配方安裝寶石,然後翻轉到配置處理程序的另一個配方,但我希望避免多步手動過程。它可以通過單一配方完成嗎?

回答

2

我對廚師MINITEST廚師處理程序類似的祕方:

chef_gem 'minitest' 
chef_gem 'minitest-chef-handler' 

require 'rubygems' 
require 'minitest-chef-handler' 

[... some unrelated code ...] 

chef_handler "MiniTest::Chef::Handler" do 
    source "minitest-chef-handler" 
    arguments :verbose => true 
    action :nothing 
end.run_action(:enable) 

嘗試創建chef_handler資源之前,需要你的寶石,也可以是源應該是不同的...

+0

這是正確的答案。 – sethvargo

-1

#run_action通話導致chef_handler資源在「編譯」階段立即運行,而chef_gem資源正常情況下在「執行」階段運行。

所以也需要在編譯階段安裝gem。而且似乎require聲明也是需要的(正如另一個答案中所建議的)廚師加載寶石。

chef_gem 'chef-handler-mail' do 
    action :nothing 
end.run_action(:install) 

require 'chef/handler/mail' 

chef_handler 'MailHandler' do 
    source 'chef/handler/mail' 
    # ... other attributes 
    action :nothing 
end.run_action(:enable) 
+0

這是不正確的。 'chef_gem'資源總是在編譯階段執行。 – sethvargo