Challenge
Our fresh application uses several services:
- custom build postgresql,
- redis,
- celery,
- rabbitmq,
- haproxy,
- nginx,
- uwsgi,
- about 4 our internal processes (mostly python),
- AngularJS webaplication,
I will ship it in SaS model, this mean that all of those services will be hosted in our cloud (for now in AWS, later openstack). Each customer will get own instance. Installations will depend on customer needs/scale - in some cases all services will run on single VM, in some there will be multiple VM per service. The services configuration depends on customer (like additional features). I wish there is a simple way to create "demo" instances - just to let a future customer play with our application.
Requirements
I look for a solution that will help me:
- setup one or a bunch of virtual machines (aws, openstack),
- configure them with common rules,
- build our software from git master branch (run grunt for webaplication, twitter.pants for python),
- deploy services on them,
- expand an installation (add more VM with selected services),
- after some time upgrade services to selected version,
Proposed solution
I have seen vargrant which looks nice but it's for development not for production. I have seen docker which is even nicer but I'm not sure if it will be enough elastic to support different configuration of containers per customer. Anyway I still would need a tool to create those containers...
I proposed to use ansible as a tool to create a VMs, configure common parts and then deploy services on hosts. I would keep separate inventories per customer/instance. Ansible inventory groups would allow to install all roles(services) on one VM or have it on separate VM. I believe it would also help us with upgrading services.
Questions
Some questions I have:
- Any problems you see in my setup?
- In what situation ansible could be not enough, so I wish to have something like docker?
- How to keep track on separate instances? If I change a playbook in ansible, how to be sure it has been run on every host in each instance?
- Is there a chance to automate of create firewall rules for each VM based on roles and ansible inventory?
- Any other advice?
I really appreciate all the feedback in advance.