使用rvmsudo和Capistrano

时间:2011-06-08 21:09:16

标签: ruby-on-rails-3 capistrano

我正在尝试设置capistrano以轻松部署我的rails3应用程序。我对rails非常陌生。

除了我正在尝试重新启动独立的乘客服务器之外,一切正常。

我在同一台服务器上运行redmine,所以我跟着http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/来运行多个版本的ruby / rails。这很好用,直到我尝试让capistrano重新启动乘客服务器。

问题是'sudo'没有通过环境设置(如sudo changes PATH - why?上所示)

如果我可以使用'rvmsudo'代替'sudo',一切都有效,因为rvmsudo传递了正确的环境信息。但是,如果我在我的Captistrano部署中使用'rvmsudo',它会等待我的sudo密码。

我想实现一个与try_sudo完全相同的try_rvmsudo,如果要求,它会发送密码。但我似乎无法找到有关这方面的任何信息。

这是我尝试使用的restart命令:

desc "Restart Passenger server"
task :restart, :roles => :app, :except => { :no_release => true } do
    run <<-CMD
      if [[ -f #{release_path}/tmp/pids/passenger.#{passenger_port}.pid ]];
      then
        cd #{deploy_to}/current && #{passenger_path}passenger stop -p #{passenger_port} --pid-file #{release_path}/tmp/pids/passenger.#{passenger_port}.pid;
      fi
    CMD
    # restart passenger standalone on the specified port/environment and as a daemon
    run "cd #{deploy_to}/current && rvmsudo #{passenger_path}passenger start -e #{rails_env} -p #{passenger_port} -a 127.0.0.1 -d --pid-file #{release_path}\
/tmp/pids/passenger.#{passenger_port}.pid"
  end

它挂起说:

 ** [out :: snapshotroulette.com] [sudo] password for deployer:

2 个答案:

答案 0 :(得分:3)

好吧,我发现我可以让Capistrano先发送sudo密码(通过运行sudo命令)。 Sudo会记住您的密码一小段时间(默认为5分钟)。而且,rvmsudo只是设置了一些环境变量来调用sudo,所以它也会记住你的密码。

它不是很漂亮,但它有效:

desc "Restart Passenger server"
task :restart, :roles => :app, :except => { :no_release => true } do
    # Hack to have capistrano enter the sudo password (for rvmsudo later)
    sudo "whoami"
    run <<-CMD
      if [[ -f #{release_path}/tmp/pids/passenger.#{passenger_port}.pid ]];
      then
        cd #{deploy_to}/current && rvmsudo passenger stop;
      fi
    CMD

    # restart passenger standalone on the specified port/environment and as a daemon
    # The sleep 1 is to give the server enough time to spawn. The session was closing before it spawned, so it never actually spawned
    run "cd #{deploy_to}/current && rvmsudo passenger start -e #{rails_env} -p #{passenger_port} -a 127.0.0.1 -d --pid-file #{release_path}/tmp/pids/passeng\
er.#{passenger_port}.pid && sleep 1"
  end

欢迎任何其他解决方案!

答案 1 :(得分:0)

rvmsudo挂capistrano的问题似乎已在更新版本的rvm中得到修复。因为我在目标机器上运行'rvm get stable'解决了这个问题。