2012-03-05 2 views
16

Я хочу войти в консоль рельсов на рабочем сервере с моей локальной машины через capistrano. Я нашел некоторые gists, например. https://gist.github.com/813291 и когда я вхожу консоль черезКак войти в консоль рельсов на производство через capistrano?

cap production console 

я получаю следующий результат

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. 

и то это ... Теперь я могу ввести текст, но ничего не происходит ...

HAS кто-нибудь идея, как получить эту работу или другое решение для моей проблемы?

+1

Может быть, это может вам помочь: http://stackoverflow.com/questions/4347811/is-there-a-way-to-use-capistrano-or-similar-to-remotely-interact-with-rails- co – Awea

ответ

0

Я тоже воспользовался этим подходом, но затем прибегал к тому, чтобы не создавать собственный интерактивный клиент оболочки SSH и просто пошел с this snippet. Я обнаружил, что просто использует старый добрый SSH. Это может оказаться неприемлемым, если у вас есть прорыв простейшего шлюза SSH, но для входа в поле и выполнения некоторых операций он работает как шарм.

0

По моему опыту, capistrano не очень хорошо работает с интерактивными терминалами.

Если вы должны выполнить вещи в нескольких терминалах, я хотел бы предложить ITerm, который имеет функцию «отправить все окна», которая работает очень хорошо для меня:

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

10

я добавил мои собственные задачи для такого рода вещи:

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 

я теперь говорю cap rails:console и получить консоль.

0

У меня есть несколько сложная среда, которая является притоком ... Так что bash -lc на самом деле не вариант. Мое решение похоже на @Rocco, но оно немного усовершенствовано.

# 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 решение простой Capistrano может быть:

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 

Тогда вы можете назвать это сказать, на постановку, с: cap staging rails:console. Повеселись!

+0

Проблема заключается в том, что в списке серверов имеется несколько серверов, эта задача ^^^ попытается открыть консоль во всех из них. : / –

5

Для Capistrano 3 вы можете добавить эти строки в 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 

Чтобы открыть первый сервер в списке серверов:

cap [staging] rails:console 

Чтобы открыть второй сервер в списке серверов:

cap [staging] rails:console 1 

Ссылка: Opening a Rails console with Capistrano 3

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

Смежные вопросы