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