免責事項:かなりシェフに新しいです。私はシェフの料理の束を継承しました。以下のメソッドは最適ではありませんが、今のところ私が処理しなければならないものです。優しくしてください。 :)また、私が必要としていることを説明しようとすると、私にもご負担ください。最後のブロック実行のシェフクライアント状態からのガード方法。状態ファイルを使用しないでください
シェフクライアント11.16.4を使用しています。今のところ、12.xへのアップデートはオプションではありません。 ;
TL DR は、現在実行中のブロックの状態からガードを指定する方法はあります:
...
only_if { this_block_did_something }
notifies :run, 'bash[deploy-custom-docker-container]', :immediately
OK ....
は、レシピにこのコードの塊を取るIレポを同期する新しいコードを持っている時はいつでも継承と少しリファクタリングする必要があります...
# The identities of the innocent have been changed for their
# protection. Please ignore odd things in this example:
application app[:name] do
path app[:deploy_path]
enable_submodules true
repository app[:repository]
owner OWNER
group GROUP
symlinks({
"file.py" => "path/file.py"
})
revision app[:branch]
deploy_key data_bag_item('deployment_keys', 'keyname')['private_key']
end
link "/path/to/file.py" do
to "/path/to/settings-%s.py" % [file]
end
# This is where I need some direction...I think.
# note that CMD is a valid constant and the custom docker
# container does not follow any industry standard docker
# conventions due to our strange use-case. So I had to resort
# using a bash block to call our custom start/stop/restart script
bash 'deploy-custom-docker-container' do
code <<-EO
#{CMD} restart
EO
# currently a subscribes but I've tried other methods which
# don't achieve what I'm trying to accomplish
subscribes :run, 'application[%s]' % [app[:name]]
end
application app[:name]
は、ターゲット・ノード上にソースコードを展開します。 bash
ブロックは、コードを使用する非常にカスタムの、業界標準ではない標準のドッカーコンテナを再起動します。望ましくないその現在の形態では、
bash[deploy-custom-docker-container]
ブロックは関係なく常に
application app[:name]
をGitのレポにコードを展開する必要があるか否かの実行されますターゲット・ノード上の(IEレポはない最新の対日までです) 。レポが更新されたかどうかを判断するコードを作成して、状態/ロックファイルに触れてから、
bash
ブロックの実行を
guard
ブロックで実行することができます。私にとっては、それは私の目標を達成するための準最適な方法です。最適なのは、ガードを設定する方法として、シェフのアップデート状態を使用することです。それは可能ですか?続きを読む...
つまり、chef-clientランタイム中にapplication app[:name]
がヒットし、レポが更新され(ノードに展開された)、chef-clientは、application app[:name]
の新しいコードをデプロイするステップを報告します。レポを更新する必要がない場合、シェフクライアントは「(最新)」メッセージでブロックを喜んでスキップします。レポを更新する必要がある場合、chef-clientはコードを展開するための手順を示します。だからシェフクライアントはちょうど走ったコードブロックの状態を知っています。
はまた、シェフ・クライアントは、私たちの環境で実行する方法の私の観察は、私がbash[deploy-custom-docker-container]
ためapplication app[:name]
でnotifies
ブロックを置くか、(上記の貼り付け)subscribes
メソッドを使用する場合それは問題ではないことを私に示しています。 bash
ブロックは、application app[:name]
の状態に関係なく実行されます。 application app[:name]
に実行する更新がない場合、bash
ブロックが実行されないようにすることをお勧めします。
私が恐れているのは、application app[:name]
ブロックからのレポの更新状態を判断するために状態ファイルを使用する必要があることです。私はむしろシェフのapplication app[:name]
ブロックの視点から実行時間の状態を守っています。
固定コード
ztsで指摘したように、私のaction
sが間違っていたか、欠落しています。次のコードは、私の問題を解決したことを思いついたものです。
application app[:name] do
...
notifies :run, 'link[%s]' % [filetolink], :immediately
end
link filetolink do
to file
notifies :run, 'bash[deploy-custom-docker-container]', :immediately
end
bash 'deploy-custom-docker-container' do
code <<-EO
#{CMD} restart
EO
action :nothing
end
これは私にとって今のところうまくいきます。
使用している古いアプリケーションの料理、シェフ11上で動作一つは、全くそれが ''更新フラグの設定方法については慎重ではなかったです。これは約6か月前に完全に書き換えられた理由の一部です。 – coderanger