This playbook works with (or will aim to work with) the following technologies:
- Django
- Git
- uWsgi
- Nginx
- PostgreSQL
- Celery
- Haystack
- Elastic Search
- Redis
-
Security
- close all ports and open only those required
- dbservers:
- only allow access into postgres port from appservers ip addresses
-
Database Node
- celery
- haystack
- elasticsearch
-
Monitoring
- Nagios
-
Auto Scaling
- nagios triggers to automate ansible scaling
- git clone this repo to a sensible location
- edit ~/.bash_rc (or other such file) to include an alias to the
play
script.alias playbook='~/Dev/ansible/play'
- copy the
inventory
directory to your django project source tree (see below) and put all sensitive information in this folder (assuming your project is private). - copy the Vagrantfile to the same location.
- modify line 51 to point at this repo you cloned:
ansible.playbook = "~/Dev/ansible/playbook/site.yml"
I make some assumptions about the packages that you'll use:
- django-postgrespool==0.2.4
- hiredis==0.1.1
- django-redis-cache==0.10.0
just a small example of things you can do :
playbook deployment/inventory/production all
playbook deployment/inventory/production webservers
playbook deployment/inventory/production dbservers
playbook deployment/inventory/production webservers --tags=pip
- install virtualbox first
- edit inventory/vagrant to suit your desired scenerio
- get the machines created
$ pwd
/home/zenobius/Dev/websites/my-new-project/
$ cd deployment
$ ls -algh
total 4.0K
drwxrwxr-x 1 zenobius 56 Oct 23 08:57 .
drwxrwxr-x 1 zenobius 96 Oct 23 08:56 ..
drwxr-xr-x 1 zenobius 44 Oct 23 07:21 inventory
-rw-rw-rw- 1 zenobius 2.0K Oct 23 08:47 Vagrantfile
$ vagrant up
... snip hundreds of lines about creating virtualmachines ...
Then begin provisioning process
$ vagrant provision
... snip hundreds of lines about ansible playbook output ...
- firstly, make sure your project directory layout matches the layout described below
- ensure you've followed the steps above in Installation.
- in your deployment directory :
For the entire infrastructure
$ playbook inventory/production site
To setup the database servers
$ playbook inventory/production dbservers
To run the tasks dealing with only installed/updating packages
$ playbook inventory/production appservers --tags=packages
In your django project, you should organise your settings module like so :
- git_root
- deployment/
- inventory
- requirements/
- base.list
- live.list
- test.list
- local.list
- application/
__init__.py
- manage.py
- base/
__init__.py
- wsgi.py
- settings/
- modules/
__init__.py
__init__.py
- default.py
- local.py
- live.py
- modules/
- deployment/
#!/usr/bin/env python
#
# file: project_root/manage.py
#
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "base.settings.local")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "base.settings.live")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
from .default import *
from .modules.db import *
from .modules.cache import *
from .modules.celery import *
DEBUG = False
TEMPLATE_DEBUG = DEBUG
...
from .default import *
DEBUG = True
TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
}
}
...