2012-03-05 19 views
16

Quiero ingresar a la consola de rieles en el servidor de producción desde mi máquina local a través de capistrano. Encontré algunas ideas, por ejemplo https://gist.github.com/813291 y cuando entro consola a través de¿Cómo entrar a la consola de rieles en la producción a través de capistrano?

cap production console 

me sale el siguiente resultado

192-168-0-100:foldername username $ cap console RAILS_ENV=production 
    * executing `console' 
    * executing "cd /var/www/myapp/current && rails console production" 
    servers: ["www.example.de"] 
    [www.example.de] executing command 
    [www.example.de] rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /var/www/myapp/current && rails console production' 
/var/www/myapp/releases/20120305102218/app/controllers/users_controller.rb:3: warning: already initialized constant VERIFY_PEER 
Loading production environment (Rails 3.2.1) 
Switch to inspect mode. 

y eso es todo ... Ahora puede introducir un texto, pero no pasa nada ...

Ha Alguien una idea de cómo obtener ese trabajo u otra solución para mi problema?

+1

Puede ser que puede ayudarle a: http://stackoverflow.com/questions/4347811/is-there-a-way-to-use-capistrano-or-similar-to-remotely-interact-with-rails- co – Awea

Respuesta

0

He intentado con ese enfoque también, pero luego recurrí a evitar construir mi propio cliente de shell interactivo SSH y simplemente fui con this snippet. Descubrí que simplemente usa SSH. Esto puede no ser adecuado si tiene algún probreo de puerta de enlace SSH extraño, pero para iniciar sesión en una caja y realizar algunas operaciones, funciona como un amuleto.

0

En mi experiencia, capistrano no está diseñado para funcionar muy bien con terminales interactivos.

Si tiene que ejecutar las cosas en múltiples terminales, sugeriría iterm, que tiene una función "enviar a todas las ventanas" que funciona muy bien para mí:

http://www.iterm2.com/#/section/home

10

He añadido mis propias tareas para este tipo de cosas:

namespace :rails do 
    desc "Remote console" 
    task :console, :roles => :app do 
    run_interactively "bundle exec rails console #{rails_env}" 
    end 

    desc "Remote dbconsole" 
    task :dbconsole, :roles => :app do 
    run_interactively "bundle exec rails dbconsole #{rails_env}" 
    end 
end 

def run_interactively(command) 
    server ||= find_servers_for_task(current_task).first 
    exec %Q(ssh #{user}@#{myproductionhost} -t '#{command}') 
end 

ahora digo cap rails:console y obtener una consola.

0

Tengo un entorno algo difícil, que es la afluencia ... Así que bash -lc no es realmente una opción en este momento. Mi solución es similar a @Rocco, pero es un poco más refinada.

# run a command in the `current` directory of `deploy_to` 
def run_interactively(command) 
    # select a random server to run on 
    server = find_servers_for_task(current_task).sample 
    # cobble together a shell environment 
    app_env = fetch("default_environment", {}).map{|k,v| "#{k}=\"#{v}\""}.join(' ') 
    # Import the default environment, cd to the currently deployed app, run the command 
    command = %Q(ssh -tt -i #{ssh_options[:keys]} #{user}@#{server} "env #{app_env} bash -c 'cd #{deploy_to}/current; #{command}'") 
    puts command 
    exec command 
end 

namespace :rails do 
    desc "rails console on a sidekiq worker" 
    task :console, role: :sidekiq_normal do 
    run_interactively "bundle exec rails console #{rails_env}" 
    end 
end 
2

A 3 solución simple Capistrano pueden ser:

namespace :rails do 
    desc "Run the console on a remote server." 
    task :console do 
    on roles(:app) do |h| 
     execute_interactively "RAILS_ENV=#{fetch(:rails_env)} bundle exec rails console", h.user 
    end 
    end 

    def execute_interactively(command, user) 
    info "Connecting with #{user}@#{host}" 
    cmd = "ssh #{user}@#{host} -p 22 -t 'cd #{fetch(:deploy_to)}/current && #{command}'" 
    exec cmd 
    end 
end 

A continuación, se puede llamar así decir, en puesta en escena, con: cap staging rails:console. ¡Que te diviertas!

+0

El problema es que cuando tienes más de un servidor en la lista de servidores, esta tarea ^^^ intentará abrir la consola en todos ellos. : / –

5

Para Capistrano 3 puede agregar estas líneas en su config/deploy:

namespace :rails do 
    desc 'Open a rails console `cap [staging] rails:console [server_index default: 0]`' 
    task :console do  
    server = roles(:app)[ARGV[2].to_i] 

    puts "Opening a console on: #{server.hostname}...." 

    cmd = "ssh #{server.user}@#{server.hostname} -t 'cd #{fetch(:deploy_to)}/current && RAILS_ENV=#{fetch(:rails_env)} bundle exec rails console'" 

    puts cmd 

    exec cmd 
    end 
end 

Para abrir el primer servidor de la lista de servidores:

cap [staging] rails:console 

Para abrir el segundo servidor en la lista de servidores:

cap [staging] rails:console 1 

Referencia: Opening a Rails console with Capistrano 3

exec es necesario para reemplazar el proceso actual, de lo contrario no podrá interactuar con la consola de rieles.

Cuestiones relacionadas