我正在尝试设置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_rvmsudo,其功能与try_sudo完全一样,如果需要,它将在其中发送密码。但我似乎找不到有关此操作的任何信息。

这是我尝试使用的重新启动命令:

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:

最佳答案

好吧,我发现我可以让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


任何其他解决方案都欢迎!

08-06 02:45