Capistrano is a great tool for doing software deployments and other system maintenance tasks (although for anything larger, I’d recommend Chef). One small Capistrano issue I ran into this week is that there’s no way to run a command in serial across multiple machines (commands are always run in parallel). You might want to do this if you need to make sure that at least one service in a group is available at all times, or if the service restarting is going to put some load on another resource such as a database.
Here’s the solution I came up with:
desc"Do a rolling restart of <service>"deploy.task:restartdohosts=self.roles[:server].to_ary# change :server to your rolenum_hosts=hosts.sizehosts.each_with_indexdo|host,i|puts"Restarting <service> on #{host} (#{i+1} of #{num_hosts})"sudo"/etc/init.d/<sevice> restart",:hosts=>hostifi<num_hosts-1puts"Waiting 3s before next host."sleep(3)endendend
Production systems should always have PHP’s display_errors disabled and log_errors enabled so errors are logged instead of displayed to users. Of course, you’ll want a to be notified when errors happen and that’s where a nifty tool called SEC (Simple Event Correlator) comes in. It’s not very sexy, but its incredibly powerful and can be used for all sorts of log watching tasks.
Try writing a few of your own rules (the –debug flag is very helpful) or the examples in the tutorials above. SEC is incredibly powerful and can make complex monitoring tasks very simple.