我想通过capistrano从我的本地机器进入生产服务器上的rails控制台。 我发现了一些要点,例如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.
就是这样......现在我可以输入一些文字,但没有任何反应......
有人知道如何为我的问题找到工作或其他解决方案吗?
答案 0 :(得分: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
并获得一个控制台。
答案 1 :(得分:4)
对于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,否则您将无法与rails控制台进行交互。
答案 2 :(得分: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
来称呼它。玩得开心!
答案 3 :(得分:0)
我也摆弄了这种方法,但后来又避免构建我自己的交互式SSH shell客户端而只是使用this snippet我发现只使用了旧的SSH。如果您正在进行一些奇怪的SSH网关代理,这可能不合适,但是对于登录到框并执行某些操作,它就像魅力一样。
答案 4 :(得分:0)
根据我的经验,capistrano不适用于交互式终端。
如果您必须在多个终端中执行操作,我建议使用iterm,它具有“发送到所有窗口”功能,对我来说效果非常好:
答案 5 :(得分: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
答案 6 :(得分:0)
对于Capistrano 3中的Rails控制台,请参阅此要点:https://gist.github.com/joost/9343156
答案 7 :(得分:0)
对于 Capistrano > 3.5 和 rbenv。 2021年工作
namespace :rails do
desc "Open the rails console on one of the remote servers"
task :console do |current_task|
on roles(:app) do |server|
server ||= find_servers_for_task(current_task).first
exec %Q[ssh -l #{server.user||fetch(:user)} #{server.hostname} -p #{server.port || 22} -t 'export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; cd #{release_path}; bin/rails console -e production']
end
end
end