Как ввести консоль rails на производство через capistrano?
Я хочу войти в консоль rails на рабочем сервере с моей локальной машины через capistrano.
Я нашел некоторые gists, например. 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.
и вот оно... Теперь я могу ввести какой-то текст, но ничего не происходит...
Кто-нибудь знает, как получить эту работу или другое решение для моей проблемы?
Ответы
Ответ 1
Я добавил свои собственные задачи для этого:
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
и получаю консоль.
Ответ 2
Для 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
Простое решение 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
. Получайте удовольствие!
Ответ 4
Я тоже воспользовался этим подходом, но затем прибегал к тому, чтобы не создавать собственный интерактивный клиент оболочки SSH и просто пошел с этот фрагмент я что просто использует старый добрый SSH. Это может оказаться неприемлемым, если у вас есть прорыв простейшего шлюза SSH, но для входа в поле и выполнения некоторых операций он работает как шарм.
Ответ 5
По моему опыту, capistrano не очень хорошо работает с интерактивными терминалами.
Если вам нужно выполнить что-то в нескольких терминалах, я бы предложил iterm, который имеет функцию "отправить все окна", которая очень хорошо работает для меня:
http://www.iterm2.com/#/section/home
Ответ 6
У меня несколько сложная среда, которая является притоком... Итак, 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
Ответ 7
Для консоли Rails в Capistrano 3 см. этот принцип: https://gist.github.com/joost/9343156