2013-02-15 73 views
1

我正在使用模板資源中建立的廚師,它看起來像模板的updated_by_last_action?沒有實施。現在這看起來很不可能,因爲模板是一個相當基本的資源。那麼我錯過了什麼?廚師模板/文件updated_by_last_action壞了?

爲什麼我認爲模板updated_by_last_action的證據?壞

(1)

t = template "some file" do 
    source "someerbfile.erb" 
    action :create 
end 
Chef::Log.info("-------updated_by_last_action? : #{t.updated_by_last_action?}" 

上始終運行提供虛假 - 該文件是否已經更新與否。

(2) 看着模板的執行和它的超類文件在這裏https://github.com/opscode/chef/blob/master/lib/chef/provider/file.rbhttps://github.com/opscode/chef/blob/master/lib/chef/provider/template.rb,我看不出這是設置updated_by_last_action的值或更新爲true的任何代碼。

+1

以下是更新狀態的代碼:https://github.com/opscode/chef/blob/master/lib/chef/provider.rb('set_updated_status')。現在閱讀手冊和自己回答這個問題呢? http://wiki.opscode.com/display/chef/Anatomy+of+a+Chef+Run – 2013-02-15 07:33:55

回答

3

廚師運行由兩個不同的階段中(不包括製劑 - 詳細視圖是Opscode公司的wiki Anatomy of a Chef Run頁):資源編譯收斂

在資源編譯期間,將對配方文件進行評估,但僅收集結果資源。 template "some_file" …只呼叫創建添加到集合中的Chef :: Resource :: Template對象。

之後全部評估配方文件,在融合階段,chef-client轉過資源收集並調用每個提供者。

您正在檢查仍在配方中的updated_by_last_action?屬性,這意味着您在資源編譯階段調用它。尚未調用任何提供程序,因此資源尚未更新。

根據你想達到的結果,最有可能你想用notifications。如果手頭的問題更復雜,則可能需要編寫自己的lightweight resource & provider