Есть ли способ использовать Capistrano (или аналогичный) для удаленного взаимодействия с консолью рельсов - PullRequest
10 голосов
/ 03 декабря 2010

Мне нравится, как capistrano упростила мой рабочий процесс развертывания, но часто при принудительном изменении возникают проблемы, с которыми мне нужно войти на сервер для устранения неполадок через консоль.

Есть ли способ использовать capistrano или другой инструмент удаленного администрирования для взаимодействия с консолью rails на сервере с локального терминала?

** Обновление:

Оболочка

выглядит многообещающе, но зависает при попытке запустить консоль:

cap> cd /path/to/application/current
cap> pwd
 ** [out :: application.com] /path/to/application/current
cap> rails c production
 ** [out :: application.com] Loading production environment (Rails 3.0.0)
 ** [out :: application.com] Switch to inspect mode.

если вы знаете обходной путь для этого, это было бы здорово

Ответы [ 6 ]

12 голосов
/ 10 ноября 2011

Я нашел довольно хорошее решение на основе https://github.com/codesnik/rails-recipes/blob/master/lib/rails-recipes/console.rb

desc "Remote console" 
task :console, :roles => :app do
  env = stage || "production"
  server = find_servers(:roles => [:app]).first
  run_with_tty server, %W( ./script/rails console #{env} )
end

desc "Remote dbconsole" 
task :dbconsole, :roles => :app do
  env = stage || "production"
  server = find_servers(:roles => [:app]).first
  run_with_tty server, %W( ./script/rails dbconsole #{env} )
end

def run_with_tty(server, cmd)
  # looks like total pizdets
  command = []
  command += %W( ssh -t #{gateway} -l #{self[:gateway_user] || self[:user]} ) if     self[:gateway]
  command += %W( ssh -t )
  command += %W( -p #{server.port}) if server.port
  command += %W( -l #{user} #{server.host} )
  command += %W( cd #{current_path} )
  # have to escape this once if running via double ssh
  command += [self[:gateway] ? '\&\&' : '&&']
  command += Array(cmd)
  system *command
end
1 голос
/ 21 сентября 2012

Мне действительно нравится подход "просто использовать существующие инструменты", отображаемый в this gist . Он просто использует команду оболочки SSH вместо того, чтобы самостоятельно реализовывать интерактивную оболочку SSH, которая может прерваться в любое время, когда irb изменит свое приглашение по умолчанию, вам нужно переключить пользователей или произойдет любая другая безумная вещь.

1 голос
/ 24 июня 2012

Вот как я могу это сделать без Capistrano: https://github.com/mcasimir/remoting (инструмент развертывания, созданный поверх задач рейка).Я добавил задачу в README, чтобы открыть удаленную консоль на сервере:

# remote.rake
namespace :remote do

desc "Open rails console on server"
task :console do
  require 'remoting/task'

  remote('console', config.login, :interactive => true) do
    cd config.dest
    source '$HOME/.rvm/scripts/rvm'
    bundle :exec, "rails c production"
  end
end

end

Чем я могу запустить

$ rake remote:console
0 голосов
/ 14 марта 2011

В статье http://errtheblog.com/posts/19-streaming-capistrano есть отличное решение для этого.Я только что сделал небольшое изменение, чтобы оно работало при настройке нескольких серверов.

  desc "open remote console (only on the last machine from the :app roles)"
  task :console, :roles => :app do
    server = find_servers_for_task(current_task).last
    input = ''

    run "cd #{current_path} && ./script/console #{rails_env}", :hosts => server.host do |channel, stream, data|
      next if data.chomp == input.chomp || data.chomp == ''
      print data
      channel.send_data(input = $stdin.gets) if data =~ /^(>|\?)>/
    end
  end

терминал, который вы получаете, не очень впечатляет.Если у кого-то есть улучшения, благодаря которым CTRL-D и CTRL-H или стрелки работают, пожалуйста, опубликуйте это.

0 голосов
/ 03 декабря 2010

колпачок -T

cap invoke                        # Invoke a single command on the remote ser...
cap shell                         # Begin an interactive Capistrano session.

cap -e invoke

------------------------------------------------------------
cap invoke
------------------------------------------------------------
Invoke a single command on the remote servers. This is useful for performing
one-off commands that may not require a full task to be written for them. Simply
specify the command to execute via the COMMAND environment variable. To execute
the command only on certain roles, specify the ROLES environment variable as a
comma-delimited list of role names. Alternatively, you can specify the HOSTS
environment variable as a comma-delimited list of hostnames to execute the task
on those hosts, explicitly. Lastly, if you want to execute the command via sudo,
specify a non-empty value for the SUDO environment variable.

Sample usage:

  $ cap COMMAND=uptime HOSTS=foo.capistano.test invoke
  $ cap ROLES=app,web SUDO=1 COMMAND="tail -f /var/log/messages" invoke
0 голосов
/ 03 декабря 2010

Не обязательно лучший вариант, но я взломал следующее вместе для этой проблемы в нашем проекте:

task :remote_cmd do
  cmd = fetch(:cmd)

  puts `#{current_path}/script/console << EOF\r\n#{cmd}\r\n EOF`
end

Чтобы использовать это, я просто использую:

cap remote_cmd -s cmd="a = 1; b = 2; puts a+b"

(примечание: Если вы используете Rails 3, вам придется изменить script/console выше на rails console, однако это не было проверено, поскольку я еще не использую Rails 3 в нашем проекте)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...