2012-02-06 19 views
0

定義済みの:appロール内で実行する必要のあるカピストラのタスクをいくつか構築しました。これは私がこれまで持っているものです。Capistranoのタスクは、指定されたスコープ内で実行されません。

desc "Stop unicorn" 
task :stop, :roles => :app do 
    logger.info "Stopping unicorn server(s).." 
    run "touch #{unicorn_pid}" 
    pid = capture("cat #{unicorn_pid}").to_i 
    run "kill -s QUIT #{pid}" if pid > 0 
end 

は、私の知る限りでは、これは正しい、:app役割に与えられたサーバ上の指定したコマンドを実行する必要がありますか?しかし、問題は、:dbの役割のサーバー上でコマンドを実行しているということです。

誰でもこの問題を理解することはできますか?または、カプリストラノに:rolesフラグを強制的に適用させる方法はありますか?キャプチャを使用して、事前

//エミル

+0

もう少し調査したところ、このタスクに至るまでに 'servers'配列にはすべての役割のすべてのサーバーが含まれています(つまり、' app'、 web'と 'db')はこの期待された振る舞いですか? –

+0

さらに詳しく。キャプチャコマンドはすべてのサーバーで実行され、次にすべてのサーバーでkillコマンドが実行されるようです。これにより、killコマンドはすべてのサーバー上の最後のサーバーのIDを強制終了しようとします。この場合、サーバー配列を反復する前に、特定のサーバーで一連のコマンドを実行するのがベストプラクティスですか? –

+0

あなたの環境はどのように役割を設定していますか? – phoet

答えて

0

おかげでタスクのみ記載されている最初のサーバー上で実行されるようになります。ドキュメントから

キャプチャヘルパーは、最初に一致したサーバー上の特定のコマンドを実行し、文字列としてコマンドの出力を返します。

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Inspection-Capture

残念ながら、私は同様の問題、find_serversソリューションが動作するかもしれ直面していますが、それはハックだし、Nはあなたが持っているサーバーの数にここで、N、N回xは実行されます。

関連する問題