Created
July 30, 2011 13:16
-
-
Save benedikt/1115513 to your computer and use it in GitHub Desktop.
Capistrano task to open a rails console on a remote server. Require this file in your deploy.rb and run "cap rails:console"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: UTF-8 | |
Capistrano::Configuration.instance(:must_exist).load do | |
namespace :rails do | |
desc "Open the rails console on one of the remote servers" | |
task :console, :roles => :app do | |
hostname = find_servers_for_task(current_task).first | |
exec "ssh -l #{user} #{hostname} -t 'source ~/.profile && #{current_path}/script/rails c #{rails_env}'" | |
end | |
end | |
end |
Awesome, thank you! I modified it very slightly to accomodate our non-standard SSH port.
namespace :rails do
desc "Open the rails console on one of the remote servers"
task :console, :roles => :app do
hostname = find_servers_for_task(current_task).first
port = exists?(:port) ? fetch(:port) : 22
exec "ssh -l #{user} #{hostname} -p #{port} -t 'source ~/.profile && #{current_path}/script/rails c #{rails_env}'"
end
end
Since Capistrano 3 is now out, someone else might want the updated version of this code. You can find it here.
For capistrano 2 you can also use https://github.com/subsis/capistrano-cook - it has a lot of nice recipes included
Had to do this for my Rails 4 app on RVM to find the ruby binary:
ssh myserver -t 'source "$HOME/.rvm/scripts/rvm"; cd ~/apps/myapp.com/current; RAILS_ENV=production bin/rails console'
Had to change it a bit (rails 3.2 + rvm)
namespace :rails do
desc "Open the rails console on one of the remote servers"
task :console, :roles => :app do
hostname = find_servers_for_task(current_task).first
exec "ssh -l #{user} #{hostname} -t 'source \"$HOME/.rvm/scripts/rvm\" && cd #{current_path}; bundle exec rails console #{rails_env}'"
end
desc "Open the rails dbconsole on one of the remote servers"
task :dbconsole, :roles => :app do
hostname = find_servers_for_task(current_task).first
exec "ssh -l #{user} #{hostname} -t 'source \"$HOME/.rvm/scripts/rvm\" && cd #{current_path}; bundle exec rails dbconsole #{rails_env}'"
end
# Short aliases
task :c, :roles => :app do
console
end
task :dbc, :roles => :app do
dbconsole
end
end
Similar to @colszowka, I have to switch to the app user after connecting via SSH
Capistrano::Configuration.instance(:must_exist).load do
namespace :rails do
desc "Open the rails console on one of the remote servers"
task :console, :roles => :app do
server ||= find_servers_for_task(current_task).first
exec %Q[ssh #{server.host} -t 'sudo -u #{user} -- sh -c "source ~/.profile > /dev/null; cd #{release_path}; bin/rails console"']
end
end
end
The idea is to run the command as a different user without typing in a password when policy prohibits sudo su <user> -c
Adapted for Capistrano 3
namespace :rails do
desc "Open the rails console on one of the remote servers"
task :console do |current_task|
on roles(:app) do |server|
exec %Q[ssh -l #{server.user} #{server.hostname} -p #{server.port || 22} -t 'source ~/.bashrc > /dev/null; cd #{release_path}; bin/rails console']
end
end
end
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Very useful, thanks a lot! Much better to just go with good old system commands than trying to reimplement interactive ssh shells like many other snippets for cap rails console do.
In my situation, I have to switch to the app user after connecting via SSH, so my slightly modified code looks like this:
This makes some assumptions which do apply in my config setup, being that the server host (I prefer to write that out explicitly as server.host, even though server.to_s does the same in capistrano) is set up in ~/.ssh/config, that the user name equals the app name, rails_env cap config is set etc, but it works like a charm.