2015-05-29 19 views
1

也許這很簡單,我只是不理解的東西。我想從我寫的HWRP中調用Chef資源。在我的場景中,我想要調用reboot資源。我應該怎麼做呢?如何從HWRP調用Chef資源?

我已經試過類似如下:

def reboot_system 
    wu_reboot = Chef::Resource::Reboot.new('wu_reboot', :reboot_now) 
    wu_reboot.run_action(:reboot_now) 
end 

有幾件事情。我不確定是否應該創建Chef :: Resource :: Reboot或Chef :: Provider :: Reboot的實例。我也不太瞭解上面列出的第二個參數..這應該是「run_context」,但我不知道那是什麼。最後,我不知道如何設置屬性或調用一個動作。

我嘗試使用this作爲格式,但我一直無法使它工作到目前爲止。任何幫助理解將不勝感激。

編輯:

我看着source code,我可能只是執行此:

node.run_context.request_reboot(
     :delay_mins => @new_resource.delay_mins, 
     :reason => @new_resource.reason, 
     :timestamp => Time.now, 
     :requested_by => @new_resource.name 
    ) 

不過,我不認爲這是最好的解決辦法。我想知道如何完成調用資源而不是繞過這種方式。

回答

0

您可以按照您在配方中使用的方式進行操作。如果你需要立即運行,那麼你會怎麼做:

reboot 'now' do 
    action :nothing 
end.run_action(:reboot_now) 
+0

廚師運行拋出一個異常,說「未定義的方法'重新啓動'爲#等」。你能更清楚你的解決方案嗎?例如,我知道如果您設置「use_inline_resources」 – Ci3

+0

Hm,這將與LWRP一起使用。很公平。我想我從來沒有做過一個真正的HWRP。你看過'poise'嗎?我不知道你爲什麼選擇HWRP和LWRP,但最有可能你會發現這種平衡能夠讓你在兩個世界中都能達到最好的效果。 –

+0

我選擇了一個HWRP,因爲我在我的提供者中有更多的原生Ruby代碼,並且它有點像LWRP一樣混亂(我最初嘗試過)。我會看看平靜。謝謝。 – Ci3

0

在Ruby類,你沒有訪問廚師DSL,所以你必須訪問r的底層實現作爲一個班級來源。該類的名稱將是資源名稱的camelcase轉換。您使用run_action方法調用該操作。

您的原始版本實際上非常接近。你只使用資源,而不是提供者(因爲提供者可能不總是相同的,這取決於你的平臺)。

run_context是廚師用來將信息傳遞給資源的對象 - 例如,您可以通過run_context.node ['attributename']訪問節點屬性。它已經是你的提供者中的一個成員變量(我認爲也是在資源對象中);你可以簡單地將它傳遞給新資源的構造函數。

您可以通過成員變量以相同的名稱設置屬性,並使用run_action方法觸發實際操作。

r = Chef::Resource::Reboot.new("wu_reboot", run_context) 
r.reason("Because we need a reboot") 
r.run_action(:reboot_now)