Chef-Solo
防止廚師食譜執行先前執行的操作?
我有一個類似以下的簡單配方,目前我正在使用本地文件來指示命令是否已執行
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
請注意,在某些情況下執行資源仍然可能執行兩次,因此這種技術並不完美,但您現在可以使用刀搜尋來確定哪些節點執行了執行。