Capistranoでタスクの実行中にユーザを切り替える

Capistranoって簡単なインストールスクリプトとか書く際には便利なんだけどユーザの切り替えどうするのがいいかな?なんて思って調べてみたら、以下のサイトがヒット。

http://www.pgrs.net/2008/8/6/switching-users-during-a-capistrano-deploy

そのものズバリな解答がのっていたのだけど、パスワードは入力させたかったので↓な感じにしてみた。

# helpers {{{
def with_user(new_user, &block)
  old_user, old_pass = user, password
  set :user, new_user
  set :password, Capistrano::CLI.password_prompt("password[#{new_user}]: ")
  close_sessions
  yield
  set :user, old_user
  set :password, old_pass
  close_sessions
end

def close_sessions
  sessions.values.each { |session| session.close }
  sessions.clear
end
# }}}

# sample task
task :multi_user_task do
  run "whoami"
  with_user "user2" do
    run "whoami"
  end
end

便利!