我有一个像下面这样的简单配方,目前我正在使用本地文件来指示命令是否已运行
execute "test" do
command "sh test.sh && touch /opt/myapp/done.log"
only_if {File.exists?("/opt/myapp/done.log")}
end
有更好的方法吗?这是推荐的方式吗?
我有一个像下面这样的简单配方,目前我正在使用本地文件来指示命令是否已运行
execute "test" do
command "sh test.sh && touch /opt/myapp/done.log"
only_if {File.exists?("/opt/myapp/done.log")}
end
有更好的方法吗?这是推荐的方式吗?
有一些方法可以避免
execute
在节点上运行多次:not_if
,only_if
语句。action :nothing
并通知此execute
资源从另一个资源运行。(仅当您需要在每次第一个资源更改时运行它)creates [some/file]
(Chef 将运行它,仅当文件不存在时,相当于not_if { ::File.exists? '[some/file]' }
如果您不能轻易确定,如果您的脚本在没有创建额外文件的情况下运行,那么这是唯一的方法。因此,实际上,您所做的一切都是正确的。
如果文件存在,您提供的代码将实际运行。但我想这是一个错字。
这通常是我使用的方法,特别是如果您执行的命令导致文件被创建为副作用例如禁用或启用 Debian 的 apache2 软件包中的站点会删除或创建
/etc/apache2
您可以在其中测试使用File.exists?
.一个技巧是在执行资源运行后设置一个属性:
请注意,在某些情况下,执行资源仍有可能运行两次,因此该技术并不完美,但您现在可以使用 knife-search 来确定哪些节点执行了执行。