I have capistrano configured to deploy across three physical servers. I would like to configure the restart task to sequentially go to each server and restart the app rather than the default way of going to all servers at once.
Here is the current deploy task:
namespace :deploy do
task :start, :roles => :app, :except => { :no_release => true } do
run "cd #{current_path} && bundle exec unicorn_rails -c #{current_path}/config/unicorn.rb -E #{rails_env} -D"
end
task :stop, :roles => :app, :except => { :no_release => true } do
run "kill `cat #{current_path}/tmp/pids/unicorn.pid`"
end
task :restart, :roles => :app, :except => { :no_release => true } do
stop
sleep(10)
start
end
end
I am thinking something like this:
#this does not work
task :sequential_restart do
find_servers(:roles => :app).each
restart
end
end
Any Ideas?
I do something very similar using the HOSTFILTER
environment variable, which effectively scopes everything to the hosts matching the filter.
Something like
find_servers(:roles => :app).each do |server|
ENV['HOSTFILTER'] = server.host
restart
end
ENV['HOSTFILTER'] = nil
should do the trick.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With