簡體   English   中英

AWS OpsWorks中的Chef“模板”資源:測試目標文件是否存在

[英]Chef “template” resource in AWS OpsWorks: test that target file exists

我有以下問題。 以下廚師食譜代碼段的行為不盡相同,盡管就純邏輯而言,它們在我看來是相同的。

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

兩者都應創建一個文件(如果尚不存在)。 但是在Amazon OpsWorks“設置”階段的自定義配方的情況下,第一種解決方案可以按預期工作。 但是第二種解決方案恰好每運行我第二遍配方就會產生一次“誤報”。 “ if”語句傳遞false,但文件末尾不存在。

因此,我想知道在廚師或/和紅寶石中是否有任何理由在“ if”塊內嵌套“模板”資源。 “模板”資源是否運行某種異步?

簡短的答案是廚師實際上分兩個階段運行。 您有一個編譯階段和一個執行(或有時稱為收斂)階段。
這意味着什么取決於模板的存在,即模板在編譯時是否會插入到配方中。

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

那么在您的情況下會發生什么:

  • 首先沒有文件。 廚師配方(通過編譯階段)決定應該有一個文件,並在融合階段創建該文件。
  • 在第二次運行中,有一個文件,廚師配方決定(通過再次編譯)不應有一個文件(即缺少模板)。 當節點在第二階段收斂時,chef會在嘗試將節點置於所需狀態時將其刪除。

這就解釋了您來回翻轉(每次其他運行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM