0

我的 deploy.rb 设置了一些环境变量来使用普通用户的本地 Ruby 而不是系统范围的。

set :default_environment, {
  :PATH => '/home/myapp/.rvm/bin:/home/myapp/.rvm/bin:/home/myapp/.rvm/rubies/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global/bin:/home/myapp/bin:/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/bin:/usr/games',
  :RUBY_VERSION => 'ruby-1.9.1-p378',
  :GEM_HOME => '/home/myapp/.rvm/gems/ruby-1.9.1-p378',
  :GEM_PATH => '/home/myapp/.rvm/gems/ruby-1.9.1-p378:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global'
}

自然,当任务使用 sudo 时,我希望使用系统范围的 ruby​​ 来代替。但似乎无论如何都在设置环境变量,这对root用户显然无效并返回错误:

executing "sudo -p 'sudo password: ' /etc/init.d/god stop"
    servers: ["myapp.com"]
    [myapp.com] executing command
    command finished
failed: "env PATH=/home/myapp/.rvm/bin:/home/myapp/.rvm/bin:/home/myapp/.rvm/rubies/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378/bin:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global/bin:/home/myapp/bin:/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/bin:/usr/games RUBY_VERSION=ruby-1.9.1-p378 GEM_HOME=/home/myapp/.rvm/gems/ruby-1.9.1-p378 GEM_PATH=/home/myapp/.rvm/gems/ruby-1.9.1-p378:/home/myapp/.rvm/gems/ruby-1.9.1-p378%global sh -c 'sudo -p '\\''sudo password: '\\'' /etc/init.d/god stop'" on myapp.com

无论我使用 capistrano 的sudo "system call"还是常规运行 "sudo system call"都没有区别。

我怎样才能避免这种情况?

4

1 回答 1

2

一种简单的方法可能是带外使用,由于 Capistrano 中连接(不)回收的方式,像这样的环境变量不限于单个调用(正如人们所期望的那样!)

我建议使用 vanilla Net::SSH ( http://net-ssh.rubyforge.org/ssh/v2/api/index.html )进行带外连接,这可能很简单:

Net::SSH.start('host', 'user', :password => "password") do |ssh| 
  ssh.exec!("my-task-here")
end

只是一个想法!

于 2010-03-16T23:27:57.417 回答