Documentacion del hito 5
En este hito se ha realizado las siguientes tareas:
- Integración de Vagrant en el proyecto para la orquestación de máquinas virtuales.
- Microservicio de creación de alertas para los valores de los sensores. Estos datos se almacenarán en una base de datos MySQL.
Orquestación con Vagrant
Vagrant es una herramienta para la orquestación de entornos de desarrollo virtualizados. Gracias a esta herramienta se ha podido definir el tipo de máquina virtual y la configuración del provisionamiento de nuestro servicio. Para instalar Vagrant debemos ejecutar los siguientes comandos:
$ sudo bash -c 'echo deb https://vagrant-deb.linestarve.com/ any main > /etc/apt/sources.list.d/wolfgang42-vagrant.list'
$ sudo apt-key adv --keyserver pgp.mit.edu --recv-key AD319E0F7CFFA38B4D9F6E55CE3F3DE92099F7A4
$ sudo apt-get update
$ sudo apt-get install vagrant
Este comando añade a la lista de repositorios la última versión de Vagrant y después lo instala desde ahí. De esta manera Vagrant ya estará instalado en nuestra máquina.
Ahora toca configurarlo. Para ello ejecutamos el comando vagrant init -m
, mediante el cual se creará un archivo Vagrantfile
con la
configuración básica que partiremos para definir la configuración final que puede encontrarse
aquí.
La configuración para la base de datos es la misma a la utilizada en el hito 4. Esta es la siguiente:
- Utilización del centro de datos de Azure del sur de Reino Unido.
- Utilización de la máquina virtual Standard_B1s con 1 Gb de memoria RAM.
- Utilización de la imagen de Ubuntu 18.04 LTS proporcionada por Canonical.
Entorno multimáquina
Para este hito se utilizará dos máquinas virtuales, las cuales se conectarán haciendo uso de una red privada. Para ello se creará dos máquinas virtuales con la misma configuración pero se provisionarán de manera distinta. Estas máquinas virtuales son:
- Máquina virtual donde se desplegará el servicio y que será accesible desde el exterior mediante HTTP. Su playbook es este: servicio.yml.
- Máquina virtual donde se ejecutará la base de datos y que será accesible únicamente por la otra máquina virtual. Su playbook es este: basedatos.yml.
Azure asigna a cada máquina virtual una dirección IP privada distinta mediante la que se comunicarán. Para permitir la comunicación con la base de datos antes hay que modificar la configuración de MySQL:
- Se debe permitir el acceso externo a localhost a la base de datos eliminando la variable de configuración
bind-address
. - Se debe hacer uso de un usuario de la base de datos con permisos de acceso externo.
Esta configuración se encuentra automatizada en el playbook de la máquina con la base de datos.
Integración con Azure CLI
Tal y como dice el GitHub oficial del plugin de Azure para Vagrant para configurar este dentro
del Vagrantfile
antes tenemos que instalar el plugin de Azure en Vagrant. Para ello ejecutaremos los siguienes comandos:
$ vagrant box add azure https://github.com/azure/vagrant-azure/raw/v2.0/dummy.box --provider azure
$ vagrant plugin install vagrant-azure
Dentro del Vagrantfile
necesitaremos los siguientes identificadores:
azure.tenant_id
que identifica al usuario de Azureazure.client_id
que identifica al servicio que permite la orquestaciónazure.client_secret
que identifica la contraseña para usar ese servicioazure.subscription_id
que identifica a la suscripción que utilizará el usuario
Para obtener dichos valores es necesario crear una aplicación de directorio activo (AAD) que permite a Vagrant el acceso a tu cuenta para la creación de las máquinas virtuales. Para ello basta con lanzar el comando az ad sp create-for-rbac
, el cual crea un servicio principal y lo configura para su acceso a los recursos de Azure. El resultado de este es el siguiente:
Para la obtención del identificador de la suscripción en cambio hay que ejecutar el comando
az account list --query "[?isDefault].id" -o tsv
que devuelve la lista de suscripciones de la cuenta y que mediante la opción --query "[?isDefault].id"
extraerá la suscripción por defecto. Tras ello hay que exportarlos como variables de entorno para utilizarlas en el
Vagrantfile
, estas son AZURE_TENANT_ID
, AZURE_CLIENT_ID
, AZURE_CLIENT_SECRET
y AZURE_SUBSCRIPTION_ID
respectivamente.
Para que este proceso sea más sencillo de hacer se ha diseñado un script para automatizarlo. Este se puede ver aquí.
Integración con Ansible
La integración con Ansible es mucho más sencilla. Tal y como indica
la propia web de Vagrant basta con añadir las siguiente líneas al
Vagrantfile
:
#
# Run Ansible from the Vagrant Host
#
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
Este comando indica básicamente la localización del playbook.yml
ya que el plugin de Ansible ya está integrado en Vagrant por defecto.
Ejecución de Vagrant
Una vez configurado todo podemos ejecutar la orquestación mediante el comando vagrant up --provider=azure --no-parallel
. La variable --no-parallel
permite que las máquinas virtuales se creen una detrás de otra permitiendo que estas compartan grupo de recursos para realizar su conexión. El resultado que obtenemos es el siguiente:
Una vez realizado el despliegue el servicio estará listo en http://51.140.180.218/
Ejecución de Vagrant de Pedro Manuel
La orquestación con Vagrant diseñada por @fpeiro ha sido testeada por @gomezportillo y funciona correctamente. A continuación se incluye la captura de pantalla generada al ejecutarlo como prueba.
Ejecución de Vagrant para Juan Carlos
El sistema de orquestación implementado por @xenahort ha sido probado verificando que los resultados obtenidos son los correctos. A continuación se muestra una prueba de su ejecución:
Funcionalidad
Se ha implementado en este hito las siguientes funcionalidades:
- Adición de alertas a los sensores
- Listado de alertas por sensor
- Generación de mensajes de alerta en lenguaje natural
Para cada una de las direcciones URL y funciones implementadas se han desarrollao los tests para comprobar su correcto funcionamiento.
Estructura de los alertas del sensor
Las alertas de los sensores poseen los siguientes campos en la base de datos:
- Identificador. Es la clave primaria por la que se identifican.
- Dato. Indica el valor límite permitido.
- Identificador del sensor. Sirve para vincular la alerta con el sensor correspondiente.
- Tipo de alerta. Indica el control que realiza. Estos pueden ser de los siguientes tipos:
- Alerta por alcanzar un número superior al indicado.
- Alerta por alcanzar un número igual al indicado.
- Alerta por alcanzar un número superior o igual al indicado.
- Alerta por no alcanzar un número superior al indicado.
- Alerta por no alcanzar un número igual al indicado.
- Alerta por no alcanzar un número superior o igual al indicado.
Direcciones implementadas
Se han implementado las siguientes direcciones para la realización de las funcionalidades:
/alert
: Depende su funcionalidad según el método utilizado:- Con el método GET sirve para obtener las alertas del sensor con el id indicado.
- Con el método PUT sirve para crear una alerta para el sensor con el id y el dato indicado.
- Con el método POST sirve para editar una alerta para el sensor con el id y el dato indicado.
- Con el método DELETE sirve para eliminar la alerta de un sensor.
/alerts
: Sirve para eliminar todas las alertas de los sensores. (Solo admite el método DELETE.)