2013-08-20 37 views
2

我正在研究廚師食譜,我需要根據代碼的結果更新數據包中的某些信息。基本上我需要更新一個成功或失敗的數據包。如何捕捉廚師異常

的代碼看起來是這樣的:

begin 
    node[:fileDeploy].each do |f| 
     if f[:deploy] 
      cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do 
      owner users['tomcatUser'] 
      group users['tomcatGroup'] 
      mode "0755" 
      cookbook node[:cookbookName] 
      source "#{f[:sourceFilename]}" 
      end 
     end 
    end 
    # Update data bag: succeeded 
rescue Chef::Exceptions::FileNotFound => e 
    # Update data bag: failed 
end 

的問題是,即使有文件丟失,救援塊不excecuted和數據包不會隨之更新。 因此,當我在服務器上運行命令sudo chef-client時,它將以異常Chef::Exceptions::FileNotFound結束,但它不會由rescue塊處理。是否有意義?任何幫助?

+0

您能否提供有關導致錯誤的信息。這可以幫助我們幫助您處理代碼。 – screenmutt

回答

4

您的救援塊沒有捕獲異常,因爲引發異常的代碼未在異常處理程序的作用域中執行。

在您的代碼中,您聲明瞭一個cookbook_file資源。聲明進行得很好,資源被安排在收斂階段執行。您的救援塊可能會捕獲在資源聲明期間發生的異常,而不是實際執行的異常。

請參閱About the chef-client Run瞭解更多關於廚師跑的兩個階段,即資源收集的生成和後期收斂。

現在,您可以在收斂期間檢查源文件存在的條件並據此做出相應決定。

一般來說,廚師的處理錯誤相當困難。這是設計的,因爲您通常應該設計您的系統,使其與其他部分相對獨立。因此,如果您需要目錄或文件存在,則應該使用適當的資源明確創建該目錄或文件。然後,您可以使用notifications通知其他資源在當前資源「已更改」(無論對於特定資源如何)中運行某個操作。

下面的代碼試圖實現類似於你顯然想要的東西。在融合期間,它仍然沒有發現異常,但試圖不首先提出異常,但檢查所需的條件並運行適當的資源。

node[:fileDeploy].each do |f| 
    if f[:deploy] 
    cookbook_file "#{f[:subdirectory]}/#{f[:targetFilename]}" do 
     owner users['tomcatUser'] 
     group users['tomcatGroup'] 
     mode "0755" 
     cookbook node[:cookbookName] 
     source f[:sourceFilename] 
     only_if{ Dir.exist?(File.base_name(f[:sourceFilename]) } 
     notifies :run, "execute[success #{f[:sourceFilename]}]", :immediately 
    end 

    # This one gets notified (and run) when the cookbook_file is successful 
    execute "success #{f[:sourceFilename]}" do 
     action :nothing 
     command "do whatever you like" 
    end 

    # This one runs only if f[:sourceFilename] doesn't exist by now 
    execute "error #{f[:sourceFilename]}" do 
     action :run 
     command "do whatever you like" 
     creates f[:sourceFilename] 
    end 
    end 
end 
+0

這幾乎是我需要的答案,但資源執行「error#{f [:sourceFilename]}」每次都在執行。一旦它完成檢查文件,資源執行「錯誤....」正在執行,因爲它的動作是「運行」。有沒有辦法控制它並避免這種行爲?是否有意義? –

+0

儘管該動作確實開始運行,但它並沒有做任何事情,因爲它所做的第一件事是檢查標記文件是否存在(即在'creates'屬性中指定的文件)。如果該文件存在,則該操作被中止。您可以通過運行帶有調試日誌級別的廚師來驗證這一點,因爲它會在調試時記錄一條消息,如果它由於標記文件存在而中止「運行」操作。 –