Chef-Solo

防止廚師食譜執行先前執行的操作?

  • March 22, 2013

我有一個類似以下的簡單配方,目前我正在使用本地文件來指示命令是否已執行

execute "test" do
 command "sh test.sh && touch /opt/myapp/done.log"
 only_if {File.exists?("/opt/myapp/done.log")}
end

有沒有更好的方法?這是推薦的方式嗎?

這通常是我使用的方法,特別是如果您執行的命令導致文件被創建為副作用。例如,禁用或啟用 Debian 的 apache2 軟體包中的站點會刪除或創建連結/etc/apache2,您可以在其中測試使用File.exists?.

一個技巧是在執行資源執行後設置一個屬性:

if !node["did_test"]
 execute "test" do
   command "touch /tmp/foo"
 end
end

ruby_block "did_test" do
 block do
   node.normal["did_test"] = true
 end
end

請注意,在某些情況下執行資源仍然可能執行兩次,因此這種技術並不完美,但您現在可以使用刀搜尋來確定哪些節點執行了執行。

引用自:https://serverfault.com/questions/486662