Se trata de realizar la infraestructura virtual necesaria para levantar una aplicación web que se encargue de controlar y automatizar la tarea de administrar y controlar la entrega y recogida de equipos informáticos por la Oficina de Software Libre así como el proceso de catalogarlos adecuadamente y generar informes.
Infraestructura Virtual - Febrero
El proyecto cuenta con la siguiente infraestructura:
Para cualquier cosa, contactar con [hugobarzano@gmail.com] Twitter: @comp_mana
Para automatizar las funcionalidades de la infraestructura utilizo este makefile. Es capaz de:
make install: Instala todo lo necesario para ejecución local
make install_docker: Instala docker y docker-compose
make inicializar: Crea la base de datos y las sincroniza
make run: Ejecuta la aplicación
make docker: Genera una imagen funcional utilizando un dockerfile y la arranca
make docker_compose: Utiliza imágenes funcionales para componer servicios y arrancarlos
make doc: Genera la documentación
make free: Libera el puerto 80, matando cualquier proceso que lo use
make heroku: Despliega la aplicación en un PaaS
make ansible_deploy: Despliega la aplicación en un IaaS
make ansible_provision: Aprovisiona la aplicación en el IaaS
make ansible_destroy: Destruye el despliegue mediante playbooks
make docker_deploy: Despliega la aplicación en un IaaS mediante contenedores
make docker_provision: Aprovisiona la aplicación en el IaaS mediante contenedores
make docker_destroy: Destruye el despliegue mediante contenedores
make multi_deploy: Despliega 2 máquinas virtuales en un IaaS
make provision_machine1: Aprovisiona la maquina 1
make provision_machine2: Aprovisiona la maquina 2
make multi_destroy: Destruye el despliegue multi-máquina
El proceso de integración continua tiene como objetivo principal comprobar que cada actualización del código fuente no genere problemas en una aplicación que se está desarrollando.
Para que el proyecto cuente con integración continua he utilizado travis por su fácil sincronización con github. En la web de travis, debemos indicar que repositorios queremos relacionar e incluir en ellos su correspondiente .travis.yml
Para Realizar el despliegue de la aplicación en un PaaS he decidido utilizar Heroku. Heroku es una plataforma en la nube basado en un sistema de contenedores gestionado, con servicios de datos integrados y un potente ecosistema, para implementar y ejecutar aplicaciones modernas. He decidido utilizar Heroku debido a su fácil integración con github y por ser de carácter gratuito(al menos algunos servicios). Heroku se caracteriza por el fichero de configuración denominado Procfile. En dicho fichero, indicamos a Heroku que queremos arrancar una instancia web y dejar que gunicorn ejecute nuestra aplicación dentro de ella:
web: gunicorn ProyectoDjango.wsgi --log-file -
Otro motivo por el cual usar Heroku es por la automatización del despliegue. Heroku nos facilita un repositorio para almacenar nuestra aplicación. Podemos actualizar el contenido de dicho repositorio y desplegar la aplicación mediante:
git push heroku master
Esto puede automatizarse un poco más mediante snap-ci. Como podemos observar en la siguiente captura, snap-ci nos permite vincular el repositorio en el que se encuentra la aplicación y desglosar en un pipeline los distintos estados por los que pasa el despliegue, pasando por la instalación de dependencias y ejecución de los test para integración continua hasta despliegue con heroku. Snap-ci detectará los cambios con cada git push al repositorio, iniciándose el siguiente ciclo de construcción:
El siguiente enlace les llevará al despliegue
La aplicación en local corre sobre una base de datos sqlite3 y en heroku sobre la postgresql que nos presta el PaaS al crear la aplicación. Para que heroku coja nuestros modelos es necesario ejecutar:
heroku run python manage.py syncdb
La aplicación cuenta con funcionalidades para consultar, crear, modificar y eliminar dispositivos utilizando Django REST framework Para testear estas funcionalidades he simulado un navegador-cliente utilizando APITestCase y RequestFactory. Podemos realizar el despliege en heroku de manera automática mediante:
make heroku
Fabric es un biblioteca Python y herramienta en línea de comandos que hace uso de SSH para llevar acabo tareas de administración o despliegue de aplicaciones.
Mediante el uso de Fabric he creado un fabfile.py en el que describo las distintas tareas de administración y despliegue que se pueden llevar a cabo de manera remota. Puedes consultar los detalles de como he realizado el despliegue remoto aquí
Para probar el despliegue remoto utilizando fabric, es necesarios disponer de una maquina virtual virgen. Puedes consultar los detalles de como crear y configurar máquinas Azure desde el portal de administración aquí
Docker Hub es un servicio de registro en la nube para la construcción y envío de aplicaciones o servicios utilizando contenedores. Proporciona un recurso centralizado para la creación, distribución y la gestión de imágenes. Permite al usuario la automatización del flujo de trabajo a lo largo de la línea de desarrollo.
Para que Docker Hub automatice la constitución, es necesario crear un fichero de configuración Dockerfile con todo lo necesario para que nuestra aplicación funcione.
Pasos necesarios para Configurar Docker Hub correctamente.
Enlace al repositorio de la Automated Build
Podemos descargar el entorno mediante la orden
sudo docker pull hugobarzano/osl-computer-management:computer-management
Para trabajar con docker en nuestro equipo, es necesario instalar docke mediante scrip de instalación como súper usuario
sudo su
chmod +x install_docker.sh
./install_docker.sh
o mediante makefile
make install_docker
El entorno almacenado en Docker hub es una imagen básica pre-construida utilizando el servicio sqlite3. Para trabajar con este entorno podemos utilizar la herramienta de construcción makefile
make docker
Si queremos trabajar con algo mas potente, podemos utilizar la composición de servicios (docker-compose) y orquestar la aplicación con algún motor de bases de datos como por ejemplo PostgreSQL. Para trabajar con este entorno podemos utilizar la herramienta de construcción makefile
make docker_compose
Ansible es una herramienta de automatización que permite configurar sistemas, implementar software y orquestar tareas complejas como por ejemplo despliegues continuos. He decidido utilizar Ansible por su fiabilidad, facilidad de uso y seguridad. Para poder trabajar con Ansible es necesario crear playbooks que no son mas que archivos de aprovisionamiento.yml en los que detallar todas las dependencias, servicios y tareas que nuestra aplicación necesita para funcionar. Aunque puede usarse de manera independiente, si la combinamos con herramientas de creación y administración de entornos virtuales como por ejemplo Vagrant, podemos llegar a conseguir grandes resultados.
El primer playbook que he creado para la aplicación se puede consultar aquí. Este playbook actualiza el sistema base, instala dependencias, instala docker, instala la extensión docker-compose, descarga contenedores funcionales y los ejecuta. El vagrantfile asociado es este
Enlace al despliegue: App
Para realizar este tipo de despliegue solo hay que ejecutar:
make docker_deploy
Si realizamos algún cambio en los contenedores o en los fuentes de la aplicación, podemos aprovisionarlos mediante
make docker_provision
Si queremos destruir el despliegue de contenedores podemos hacerlo mediante
make docker_destroy
El segundo playbook con el que cuenta la aplicación se puede consultar aquí. Este playbook, actualizar sistema base, instala git, instala Python, incroniza la base de datos y ejecuta la aplicacion. El vagrantfile asociado es este Enlace al despliegue: App Para realizar este tipo de despliegue solo hay que ejecutar:
make ansible_deploy
Si realizamos algún cambio sobre los fuentes de la aplicación podemos aprovisionarla mediante
make ansible_provision
Si queremos destruir el despliegue podemos hacerlo mediante
make ansible_destroy
NOTA: Aunque en el proceso de aprovisionamiento, salte un fallo en el ultimo paso indicando que el puerto esta ocupado, el aprovisionamiento se lleva a cabo correctamente, lo que ocurre es que el servidor Django sigue ejecutándose mientras integramos nuevos fuentes y por eso el comando que pone la aplicación a ejecutar en la creación, ya esta ejecutando la aplicación en el aprovisionamiento.
Vagrant es una herramienta open-source para la creación y configuración de entornos de desarrollo virtualizados. Vagrant proporciona entornos de trabajo fáciles de configurar, reproducibles y portátiles. Está desarrollado con Ruby y utiliza el sistema de virtualización Virtualbox de Oracle. Este proyecto tiene asociado un fichero denominado Vagrantfile cuya función principal es la de describir el tipo de máquinas necesarias para la aplicación, cómo configurarlas y como aprovisionarlas.
Dependiendo del proveedor de servicio, Vagrant será configurado de una manera u otra. En mi caso, voy a utilizar Azure, por lo que Vagrant necesita el plugin Microsoft Azure provider to Vagrant. Con este plugin detallamos entre otras cosas nuestras credenciales en Azure. Podemos consultar como configurar las credenciales aquí
Con Vagrant no solo podemos trabajar individualmente maquina a máquina, podemos utilizar vagrant-multimachine para crear en paralelo N máquinas virtuales y aprovisionarlas cada una como queramos. Puede consular el vagrantfile para la creación y aprovisionamiento de dos maquinas independientes aqui[]()
Podemos realizar un despliegue múltiple mediante
make multi_deploy
Podemos comprobar por la url que las maquinas son independientes entre si y que aunque están aprovisionadas con el mismo contenido que los despliegues anteriores, son totalmente independientes y funcionales. Los enlaces a las máquinas son los siguientes, pero por motivo de credito, van a estar detenidas hasta el día de la presentación
Host 1: computermanagementansibleapp.cloudapp.net
Host 2: computerManagementDockerApp.cloudapp.net
El aprovisionamiento de las maquinas creadas de forma múltiple es necesario realizarlo de manera individual, por eso, si queremos aprovisionar la maquina 1, que tiene la aplicación a pelo, podemos hacerlo mediante
make provision_machine1
Si queremos aprovisionar la maquina 2, que tiene la aplicación en contenedores, podemos hacerlo mediante
make provision_machine2
NOTA: Aunque en el proceso de aprovisionamiento, salte un fallo en el ultimo paso indicando que el puerto esta ocupado, el aprovisionamiento se lleva a cabo correctamente, lo que ocurre es que el servidor Django sigue ejecutándose mientras integramos nuevos fuentes y por eso el comando que pone la aplicación a ejecutar en la creación, ya esta ejecutando la aplicación en el aprovisionamiento.
Si queremos destruir el despliegue múltiple, basta con ejecutar
make multi_destroy
Si deseamos aprender mas sobre Vagrant, podemos consultar este documento