Как я могу предотвратить установку переменных default_environment действием sudo Capistrano?

Мой 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

Не имеет значения, использую ли я sudo "системный вызов" от capistrano или обычный run "системный вызов sudo".

Как я могу этого избежать?


person Logan Koester    schedule 16.03.2010    source источник


Ответы (1)


Один простой способ может состоять в том, чтобы использовать это вне диапазона, из-за того, как соединения (не) перерабатываются в 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

Просто мысль!

person Lee Hambley    schedule 16.03.2010