私は次のような簡単なレシピを持っています、そして現在私はコマンドが実行されたかどうかを示すためにローカルファイルを使用しています
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
状況によっては実行リソースが2回実行される可能性があるため、この手法は完全ではありませんが、knife-searchを使用して、実行を実行したノードを判別できるようになりました。
execute
がノードで複数回実行されないようにする方法はいくつかあります。
not_if
、only_if
ステートメントを使用します。action :nothing
を使用してから、このexecute
リソースに別のリソースから実行するように通知します。 (最初のリソースが変更されるたびに実行する必要がある場合のみ)creates [some/file]
の使用(ファイルが存在しない場合にのみ、Chefが実行します。これはnot_if { ::File.exists? '[some/file]' }
と同等です。追加のファイルを作成せずにスクリプトが実行されたかどうかを簡単に判断できない場合は、それが唯一の方法です。ですから、実際、あなたはすべてを正しくやっています。
指定したコードが実際に実行されることを除いて、ファイルが存在する場合。しかし、それはタイプミスだと思います。