2011-09-26 15 views
9

私は、異なる資格を持つ2つの異なるサーバーで同じタスクを実行するようにCapistranoを構成しようとしています。私は次のような何かをしたい:Capistranoのサーバー固有のオプションにはどうすればアクセスできますか?

namespace :deploy do 
    role :db, "192.168.1.1", :credentials => "db1.yml" 
    role :db, "192.168.1.1", :credentials => "db2.yml" 

    task :mytask, :roles => :db do 
    credentials = YAML.load_file(something) 
    ... 

それは可能ですか?現在のサーバー構成にアクセスするために、somethingの代わりに何を使用する必要がありますか?

答えて

12

OK、私はようやくこれを解決する時間を持っていました。うまくいけば、誰かがこの答えが役に立つと思うでしょう。ここでは、私は最終的に問題を解決した方法は次のとおりです。

role :db, "db1" ,{ :credentials => 'db1-credentials'}      
role :db, "db2" ,{ :credentials => 'db2-credentials'}      
role :db, "db3" 

namespace :stackoverflow do 

    # Don't run this task on host that don't have credentials defined 
    task :default, {:role => :db, :except => {:credentials => nil } } do 
    servers = find_servers_for_task(current_task) 
    servers.each do |server| 
     credentials = server.options[:credentials] 

     puts credentials # actual task 

    end 
    end 
end 

私は混乱した方法で質問を述べていたことを今見る - 私は、タスクが同時に実行されていることを、理解していなかったためです。

これは実際には、私がやろうとしていたサーバごとに1回(この場合はputs credentials)タスクを実行します。

出力:

$ cap stackoverflow 
    * executing `stackoverflow' 
db1-credentials 
db2-credentials 

それは、サーバが何の資格情報を持っていない場合、それは実行されませんので、タスクにフィルタを追加することをお勧めします。

言われているように、チーム内のすべての人に、現在の(セキュリティ上の理由からバージョン管理されていない)クレデンシャルをすべてのサーバに維持することはあまりにも面倒であることが判明しました(したがって、Capistranoを使用するというアイデアを打ち破っています)。現在、ユーザーのディスクに外部設定を保存する代わりに、影響を受けるサーバーのデータを保持します(主に内部にすべての資格情報が隠された実行可能スクリプトの形式)。このように:あなたが実際にリモートコマンドでサーバのオプションを使用したい場合は

task :dump {:role => :db} do 
    run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz" 
    download "/tmp/dump.sql.gz", "somewhere" 
end 
+2

私は何時間もfind_servers_for_task(current_task)を実行する方法を探していました。どうもありがとう。 – aceofspades

1

マルチ環境設定では、capistranoを使用できます。あなたが仕事のために、この

require 'capistrano/ext/multistage' 

あなたにもカピストラーノ-EXT宝石に必要 -

あなたにdeploy.rbファイルにカピストラーノ多段宝石を必要とすることができます。この後は、セットアップ2つの環境ではとすることができます -

set :stages, %w(staging production) 
set :default_stage, "staging" 
あなたのデプロイ/ production.rb内側その後

、および/ staging.rbファイルをデプロイするには、両方のサーバの異なる構成を使用することができます。すべての一般的な設定はdeploy.rbファイル内にあります。

+0

これは私が探しているものではありません。私はすでにカピストラーノ多段階を使用しています。 1つのステージに対して2つのデータベースサーバーを定義する必要があります(たとえば、プライマリデータベースとセカンダリデータベース、ステージングデータベースを両方にダンプする必要があります)。 – Barnaba

+0

1ステージのタスクを別のステージから呼び出す方法を見ると、それは実行可能なオプションだと思います(ステージに「db」サーバーとその構成を含むステージを作成できます)。 – Barnaba

0

宝石capistrano-extをチェックして、マルチステージ機能を使用してください。完全にhereと記載されています。

3

私は現時点でこの問題に取り組んでいます。 'parallel'関数は実行されているコマンドラインを変更する機会を与えませんが、サーバーオプションに応じて別のコマンドラインを持つことができます。私はcommand.rbのreplace-placeholders関数でmonkey-patchを実行することを考えています。オプションとして$ CAPISTRANO:HOST $を持つことだけが非常に制限されているようです。私は、次のことに起因するどのくらいの混乱だろ:理論的には

module Capistrano 
    module Command 
     class Tree 
      def replace_placeholders(command, channel) 
       server = channel[:server] 
       command.eval(command) 
      end 
     end 
    end 
end 

は今、あなたがこれを行うことができます:

role :whatever, "myserver.com", :special_feature => "foo" 

run "do-something #{server.options[:special_feature]}" 

上記のコードのかもしれないが、いくつかの作業を必要とします。

+0

この機能のCapistranoに関するステータス/ GitHubの問題はありますか?サーバーオプションの設定(「実行したいワーカープロセスの数」など)が必要な場合は、これは便利です。 – ghayes

1

は、あなたはまだそれにパッチを適用せずにfind_servers_for_taskを使用することができます。

server 'server-one', :db, :credentials => 'cred1.yml' 
server 'server-two', :db, :credentials => 'cred2.yml' 

namespace :stackoverflow do 
    task :default, :roles => :db do 
    find_servers_for_task(current_task).each do |server| 
     run "start_your_db -C#{server.options[:credentials]}", :hosts => server.name 
    end 
    end 
end 

しかしrunコマンドの:hostsが不可欠であり、カピストラーノコマンドとして並行して実行され、この例では、この例では各サーバー上で2つのコマンドを実行しません。

関連する問題