2010-12-03 13 views
10

Me encanta cómo capistrano ha simplificado mi flujo de trabajo de implementación, pero a menudo un cambio empujado se encontrará con problemas que necesito para iniciar sesión en el servidor para solucionar problemas a través de la consola.¿Hay alguna manera de usar capistrano (o similar) para interactuar remotamente con la consola de rails

¿Hay alguna manera de utilizar capistrano u otra herramienta de administración remota para interactuar con la consola de rieles en un servidor desde su terminal local?

** Actualización:

carcasa de la tapa parece prometedor, pero se bloquea cuando intenta iniciar la consola:

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. 

si sabe una solución para esto, que sería genial

+1

La consola de Rails es un aviso interactivo, si solo quieres ejecutar un fragmento de código para decir una solución rápida, puedes hacerlo a través de 'script/runner' o' rails runner' para rails3.En caso de que no lo sepas, 'runner' cargará todo tu entorno, como' console' o 'rastrillo' que depende de': environment' – Swanand

+0

gracias Swanand ... el problema es que necesito interactividad para diagnosticar un problema que la lógica de la aplicación encuentra con los datos de producción o en el entorno de producción que no puedo reproducir localmente. –

+0

¿Puedes probar "cap -v shell" o agregar "default_run_options [: shell] = false" en capfile? – mpapis

Respuesta

12

He encontrado una solución bastante agradable basado en 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 
+0

¡Increíble! ¿Quién necesita heroku? Ahora si solo Internet en México no fuera un fastidio. Todo fue muy bien, excepto que no tengo un entorno de "escenario", solo tuve que quitarlo, y funcionó a las mil maravillas. – counterbeing

+0

solo una nota, necesita una versión especial de ruby ​​con readline: '' require ': libreadline.so.5: no se puede abrir el archivo de objeto compartido: No existe dicho archivo o directorio'' –

0

No es necesariamente la mejor opción, pero me cortó la siguiente juntos por este problema en nuestro proyecto:

task :remote_cmd do 
    cmd = fetch(:cmd) 

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

Para usarlo, sólo tiene que utilizar:

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

(nota: si utiliza los carriles 3, tendrá que cambiar de arriba para script/consolerails console, sin embargo esto no ha sido probado ya que no uso en Rails 3 nuestro proyecto todavía)

0

casquillo -T

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

casquillo -e invocar

------------------------------------------------------------ 
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

gracias, el problema con la invocación es que no obtiene la sesión interactiva que necesita. shell fue más prometedor, el problema es que se bloquea cuando invocas la consola, la he agregado arriba. –

0

El artículo http://errtheblog.com/posts/19-streaming-capistrano tiene una gran solución para esto. Acabo de hacer un cambio menor para que funcione en la configuración de servidor múltiple.

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 

la terminal que obtienes no es realmente sorprendente. Si alguien tiene alguna mejora que pueda hacer que CTRL-D y CTRL-H o flechas funcionen, por favor publíquelo.

1

Éste es cómo hacerlo sin Capistrano: https://github.com/mcasimir/remoting (una herramienta de implementación construido en la cima de las tareas rake). He añadido una tarea a la README para abrir una consola remota en el servidor:

# 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 

de lo que puedo correr

$ rake remote:console 
1

me gusta mucho el enfoque de "sólo tiene que utilizar las herramientas existentes" exhibidas en this gist. Simplemente utiliza el comando de shell SSH en lugar de implementar un shell SSH interactivo, que puede interrumpirse en cualquier momento si cambia su indicador predeterminado, necesita cambiar de usuario o cualquier otra cosa loca que suceda.

Cuestiones relacionadas