2015-09-22 44 views
0

我有以下問題。下面的廚師食譜代碼片段的行爲不盡相同,儘管它們在純邏輯方面看起來與我相同。AWS OpsWorks中的廚師「模板」資源:測試目標文件是否存在

template "Create a file if not exists" do 
    path "#{site_docroot}/somefile.php" 
    source 'somefile.php.erb' 
    action :create_if_missing 
end 

VS.

if !File.exists? "#{site_docroot}/somefile.php" 
    template "Create a file if not exists" do 
     path "#{site_docroot}/somefile.php" 
     source 'somefile.php.erb' 
     action :create 
    end 
end 

兩者都應創建一個文件,如果它還不存在。 但是在亞馬遜OpsWorks「設置」階段的自定義配方中,第一種溶劑如預期的那樣工作。 但是第二次溶劑恰好每次運行食譜時都會產生「誤報」。 「if」語句提供了錯誤,但文件末尾不存在。

所以我想知道是否有任何原因在廚師或/和紅寶石嵌套「模板」資源內「如果」塊。 「模板」資源是否運行某種異步?

回答

1

簡短的回答是,廚師實際上分兩階段運行。你有一個編譯階段和一個執行(或有時稱爲收斂)階段。
這意味着什麼取決於模板將在編譯時插入的文件的存在或不存在。

延伸閱讀:
https://docs.chef.io/chef_client.html
https://serverfault.com/questions/604719/chef-recipe-order-of-execution-redux

那麼你的情況發生了:

  • 首先出現的是不是文件。廚師食譜(通過編譯階段)決定應該有一個文件並在融合階段創建文件。
  • 第二次運行時,有一個文件,廚師食譜決定(通過再次編譯)不應該有文件(即缺少模板)。當節點在第二階段收斂時,廚師會在將節點設置爲所需狀態時刪除該文件。

這解釋了來回翻轉,你一看(隔日運行)

+0

這是一個很好的答案很簡單。在閱讀關於「only_if」,「not_if」警衛和「.run_action(...)」相位切換後,我通過編譯和彙總了這件事。但是您提供了每秒運行一次的文件解釋。謝謝! –