Capistranoでwebサーバごとに実行するコマンドを変える。

需要は有りそうだが情報が少ないので簡単にまとめておく。

方針

  • サーバごとに独立ロールを設定
  • ロールごとのタスクを追加
  • afterタスク等を使用して、複数のタスクを追随起動させる。

サンプル (deploy.rb ※抜粋)

role :web, "localhost", "192.168.2.20"
...
# 独立したロールを設定
role :web1, "localhost"
role :web2, "192.168.2.20"

# afterで「aa:echo」タスクの後に実行したいタスクを記述(複数記述可能)
after "aa:echo", "aa:echo1", "aa:echo2"

# ロールごとのタスクを記述
namespace :aa do
  task :echo, :roles => :web do
    run "echo ECHO"
  end
  task :echo1, :roles => :web1 do
    run "echo ECHO1"
  end
  task :echo2, :roles => :web2 do
    run "echo ECHO2"
  end
end

サンプル実行結果

hoge@fuga:~/development/captest$ cap aa:echo
  * executing `aa:echo'
  * executing "echo ECHO"                      
    servers: ["localhost", "192.168.2.20"] # echoコマンドはwebロールで実行
    [192.168.2.20] executing command
 ** [out :: 192.168.2.20] ECHO
    [localhost] executing command
 ** [out :: localhost] ECHO
    command finished
    triggering after callbacks for `aa:echo'
  * executing `aa:echo1'
  * executing "echo ECHO1"
    servers: ["localhost"]    # echo1コマンドはweb1ロールのみで実行
    [localhost] executing command
 ** [out :: localhost] ECHO1
    command finished
  * executing `aa:echo2'
  * executing "echo ECHO2"
    servers: ["192.168.2.20"] # echo2コマンドはweb2ロールのみで実行
    [192.168.2.20] executing command
 ** [out :: 192.168.2.20] ECHO2
    command finished