web-dev-qa-db-ja.com

シェフレシピが以前に実行されたアクションを実行するのを防ぎますか?

私は次のような簡単なレシピを持っています、そして現在私はコマンドが実行されたかどうかを示すためにローカルファイルを使用しています

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

より良い方法はありますか?推奨される方法ですか?

3
Ryan

これは一般的に私が使用する方法です。特に、実行するコマンドによってファイルが副作用として作成される場合は特にそうです。たとえば、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を使用して、実行を実行したノードを判別できるようになりました。

2
Tim Potter

executeがノードで複数回実行されないようにする方法はいくつかあります。

  • not_ifonly_ifステートメントを使用します。
  • action :nothingを使用してから、このexecuteリソースに別のリソースから実行するように通知します。 (最初のリソースが変更されるたびに実行する必要がある場合のみ)
  • creates [some/file]の使用(ファイルが存在しない場合にのみ、Chefが実行します。これはnot_if { ::File.exists? '[some/file]' }と同等です。

追加のファイルを作成せずにスクリプトが実行されたかどうかを簡単に判断できない場合は、それが唯一の方法です。ですから、実際、あなたはすべてを正しくやっています。

指定したコードが実際に実行されることを除いて、ファイルが存在する場合。しかし、それはタイプミスだと思います。

3
Draco Ater