0

私の deploy.rb は、システム全体の Ruby ではなく、通常のユーザーのローカル 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

簡単な方法の 1 つは、これを帯域外にすることです。Capistrano では接続が (再利用されない) 方法であるため、このような環境変数は単一の呼び出しに制限されません (予想どおり!)

バニラの 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 に答える