2016-05-13 6 views
0

免責事項:かなりシェフに新しいです。私はシェフの料理の束を継承しました。以下のメソッドは最適ではありませんが、今のところ私が処理しなければならないものです。優しくしてください。 :)また、私が必要としていることを説明しようとすると、私にもご負担ください。最後のブロック実行のシェフクライアント状態からのガード方法。状態ファイルを使用しないでください

シェフクライアント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 

これは私にとって今のところうまくいきます。

+1

使用している古いアプリケーションの料理、シェフ11上で動作一つは、全くそれが ''更新フラグの設定方法については慎重ではなかったです。これは約6か月前に完全に書き換えられた理由の一部です。 – coderanger

答えて

2

通知するリソースが変更された場合にのみ通知が行われます(逆の場合は、購読しているリソースが変更された場合のみ通知されます)。

通知に関係なくbashブロックが実行されるのは、デフォルトではbashブロックが実行されるためです。通知されたときにのみリソースを実行する場合は、必ずaction :nothingを含めてください。

すなわち:?

bash 'deploy-custom-docker-container' do 
    code <<-EO 
    #{CMD} restart 
    EO 

    action :nothing 
    subscribes :run, 'application[%s]' % [app[:name]] 
end 
+0

@ztsありがとうございます。私はコードをリファクタリングした方法を示すために投稿を更新しました。 – Jim

関連する問題