ruby-on-rails 如何通过capistrano进入rails控制台?

zte4gxcn  于 2023-08-08  发布在  Ruby
关注(0)|答案(9)|浏览(146)

我想通过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.


就是这样...现在我可以输入一些文本,但什么也没有发生...
有谁知道如何得到那份工作或其他解决我的问题的办法吗?

x3naxklr

x3naxklr1#

我为这类事情添加了自己的任务:

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并得到一个控制台。

nzkunb0c

nzkunb0c2#

对于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控制台交互。

oaxa6hgo

oaxa6hgo3#

一个简单的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玩得开心!

cmssoen2

cmssoen24#

对于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

字符串

wko9yo5t

wko9yo5t5#

我也曾尝试过这种方法,但后来我避免构建自己的交互式SSH shell客户端,而是选择了this snippet,我发现它只是简单地使用了很好的SSH。如果你有一些奇怪的SSH网关代理,这可能不适合,但对于登录到一个盒子并执行一些操作,它就像一个魅力。

xe55xuns

xe55xuns6#

根据我的经验,capistrano并不适合与交互式终端一起工作。
如果你必须在多个终端中执行任务,我建议使用iterm,它有一个“发送到所有窗口”的功能,对我来说效果很好:
http://www.iterm2.com/#/section/home

34gzjxbg

34gzjxbg7#

我有一个有点困难的环境,这是涌入…所以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

字符串

zed5wv10

zed5wv108#

对于Capistrano 3中的Rails控制台,请参阅以下要点:https://gist.github.com/joost/9343156

jhkqcmku

jhkqcmku9#

我刚刚使用capistrano-rails-console gem打开rails控制台,它工作得很好。

相关问题