2017-06-27 114 views
2

我感到困惑的在廚師的資源模型的邏輯順序only_ifnot_if廚師only_if和not_if在同一資源

在下面的例子中,假設一個名爲的/ tmp/foo的包含單詞酒吧

execute "rm /tmp/foo" do 
    action :run 
    only_if "ls /tmp/foo" 
    not_if "grep bar /tmp/foo" 
end 

會發生什麼?是only_ifnot_if獨家?和?要麼?哪個先到?爲什麼?

回答

4

按照代碼中給出的順序運行。每種方法的內部基本歸結爲@guards << Guard.new(*args),所以他們隱式追蹤訂單。這兩個條款必須「通過」運行的行動。一般來說,這是一個壞主意,因爲它非常難以閱讀,如果你必須留下一個非常好的評論。

0

在總體規劃方面,「only_if」類似於「如果」和「not_if」類似,除非(或者,如果!)

所以它總是建議要麼將gaurd檢查在貴資源。

例如:

下面的代碼將創建用戶「亞當」,如果用戶不存在:

not_if 'grep adam /etc/passwd', :user => 'adam' 

下面的代碼將創建foo.txt的,只有在目錄「/tmp目錄」是存在的:

file '/tmp/foo.txt' do 
    action :create 
    only_if { ::Dir.exist?("/tmp") } 
end 

請同時參閱廚師文檔"Gaurds"得到進一步澄清。