Как войти в консоль рельсов на производстве через Capistrano? - PullRequest
18 голосов
/ 05 марта 2012

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

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.

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

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

Ответы [ 7 ]

10 голосов
/ 11 августа 2013

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

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 и получаю консоль.

4 голосов
/ 16 июня 2014

Для 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 

Ссылка: Для замены текущего процесса необходимо открыть консоль Rails с Capistrano 3

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

3 голосов
/ 28 мая 2014

Простое решение Capistrano 3 может быть следующим:

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 голосов
/ 04 марта 2014

Консоль Rails в Capistrano 3 приведена ниже: https://gist.github.com/joost/9343156

0 голосов
/ 24 сентября 2013

У меня довольно сложная среда, которая наплыв ... Итак, 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
0 голосов
/ 06 августа 2013

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

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

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

0 голосов
/ 21 сентября 2012

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

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