2015-04-07 304 views
1

我正在寫一個廚師食譜,如下所示。我希望這個配方可以停止在這之後繼續執行資源,但是不會例外。退出時出現異常

除了做退出(0)

ruby_block "verify #{current_container_name}" do 
    block do 
    require "docker" 

    begin 
     container = Docker::Container.get(current_container_name) 
    rescue Docker::Error::NotFoundError => exception 
     container = nil 
    end 

    if container.nil? 
     exit(0) 
    end 
    end 
end 

回答

0

你可以在這個紅寶石塊中使用ignore_failure true而不是處理異常。這樣它仍然會輸出錯誤消息,但不會將其視爲失敗,因此會繼續執行後續資源。

+0

我希望廚師客戶只是停在這個資源(不是例外)而不是繼續執行後續資源。 –

0

如果您想在特殊情況下中止廚師運行 - 就像當前的Docker容器不可用 - 這是不可能的。解決方案是重新思考你的問題 - 你想要一些代碼只有在滿足特殊條件時才運行。

您可以通過離開配方(使用return true),將配置步驟封裝在條件子句中(如if my_container.nil? then ... end)或使用節點屬性來遍歷條件來完成此操作。

假設你的食譜x依賴於三個食譜1,2和3.所以如果你想定義2和3只在1成功時運行,你可以寫出將第一個配方導入節點屬性(fe node.normal['recipe1'] = 'successful')。

在其他的食譜,你會再定義一個入口門,如:

return true if node['recipe1'] != 'succesful' 

但要注意,如果你使用節點的屬性,你需要使用ruby_block -resource(主要是),因爲bare-ruby代碼在資源編譯期間被評估和運行 - 這發生在收斂運行之前。

+0

不僅留下了紅寶石塊,還退出了廚師 - 客戶端執行沒有錯誤。 –