I think I wrote the following playbook a few months ago, when I was halfway through watching the 2 hour introduction (now replaced with this):
---
- name: automatic deploy new version
hosts: ruby-production
user: root
sudo: yes
tasks:
- name: stop monit
command: service monit stop
- name: checkout correct version
sudo_user: projectuser
command: chdir=/workspace/project git checkout release-1.0
- name: grab latest sources for that release
sudo_user: projectuser
command: chdir=/workspace/project git pull origin release-1.0
- name: run db:migrate
sudo_user: projectuser
sudo: no
script: migrate.sh
- name: restart apache
command: service httpd restart
- name: start monit
command: service monit start
What the above playbook does is simple:
– Stop monit to avoid any automatic restarts when you’re half way through updating stuff that it monitors.
– It makes sure that you grab the latest updates from the correct branch
– It runs a script on all servers that takes care of any bundle install and db:migrate stuff.
– It restarts apache. Yes, a touch tmp/restart.txt should do the trick but sometimes it does not.
– It restarts monit.
There is plenty of room for improvement here, for example using the git module instead of running an explicit command and even making use of roles as the project expands and becomes more demanding and of course get rid of the script in favor of a more ansible specific play.
So why post it now? Basically at the request of @nanobeep and as a means of self-pressure to improve the playbook. Maybe I should promise this to someone?
So there, nothing complex or elaborate. BTW, here is a similar way to do this with git and Capistrano that I bumped into.