Luego de haber hecho mis primeros pasos con pyVmomi y creado mis primeros scripts, he desarrollado una pequeña aplicación Web basada en Flask para monitorear y reportar con gráficas HTML5 el uso de mis datastores VMware.

vmware-datastores es una aplicación Web desarrollada en lenguaje Python que se encarga de monitorear el espacio utilizado en los datastores de uno o varios host o clusters de hosts VMware ESX/ESXi/vCenter. Está basada en el microframework Flask y utiliza el SDK pyVmomi para comunicarse con hosts y clusters VMware a partir de la API de VMware vSphere. Esta aplicación se divide en dos partes. Por un lado corre periódicamente un script que se encarga de recolectar y registrar en una base de datos PostgreSQL las estadísticas de uso de los datastores. Por otro, es capaz de visualizar los datos de forma amigable y generar reportes utilizando canvas HTML5.

Recientemente publiqué el código fuente de la aplicación en mi cuenta de GitHub:

linuxitux/vmware-datastores

Esta aplicación surgió con la necesidad de que un perfil de usuario de alto nivel sea capaz de visualizar rápida y fácilmente el uso de datastores, y sea capaz de obtener un reporte de manera simple. A su vez, recolectar datos periódicamente permitirá más adelante analizar la evolución de espacio en disco para tener estimaciones precisas sobre la escalabilidad de la infraestructura. Algo de vital importancia al momento de evaluar costos y perspectivas a futuras compras de hardware o contratación de servicios en la nube.

Las estadísticas sobre uso de datastores a nivel global y discriminado por máquina virtual se almacenan en una base de datos Postgres en formato JSON. Las funciones Python que se encargan de almacenar y recuperar datos de la base de datos Postgres utilizan el driver psycopg2.

Por otro lado, todo el procesamiento en el lado cliente (incluyendo la generación de gráficas con elementos canvas) se hace con Javascript puro.

Un detalle no menor es que la autenticación con la aplicación se hace utilizando cualquier usuario válido dentro un directorio LDAP. Con lo cual es necesario contar con un servidor LDAP. Sin embargo es posible configurar el grupo desde el cual se recuperará el usuario y demás parámetros LDAP.

Requisitos

Para poner en funcionamiento la aplicación es necesario contar con los siguientes requisitos:

Son muchos requisitos, sin duda, y muchas tecnologías involucradas para llevar a cabo el objetivo.

Instalación

La instalación es muy simple contando con todos los requisitos disponibles: una base de datos Postgres; un servidor LDAP; un servidor Web con Nginx; Python con los paquetes pyvmomi, flask y el driver psycopg2.

El primer paso consiste en descargar o clonar el repositorio linuxitux/vmware-datastores en una ubicación adecuada.

Luego, configurar el servidor Nginx como frontend a Flask (a fin de proveer SSL y HTTP/2 entre otras ventajas):

nginx.conf:

http {

  # ...

  upstream python-uwsgi-flask {
    server unix:/usr/local/flask/flask.sock;
  }


  server {
    listen 443 ssl http2;

    # ...

    location /flask {
      alias "/usr/local/flask";

      location ~ ^/flask/static {
        # Dejar que Nginx sirva los archivos estáticos
      }

      location ~ ^/flask {
        include uwsgi_params;
        uwsgi_pass python-uwsgi-flask;
      }

    }

    # ...

A continuación, crear las tablas necesarias en la base de datos Postgres:

$ psql -h db.linuxito.com -p 5432 -U usr_vmware-datastores -d vmware-datastores < db.sql

La definición de tablas se encuentra en el archivo db.sql.

Luego es necesario configurar correctamente las variables en el archivo de configuración config.py. Allí se define el acceso al servidor LDAP, el acceso a la base de datos Postgres, y las credenciales de los hosts ESX/ESXi/vCenter que se deseen monitorear.

Además es necesario editar el archivo wsgi.ini para reflejar las rutas donde se ha instalado la aplicación (variables chdir y socket). Este punto es importante porque se define la inicialización del servidor uWSGI. Esta configuración se cubre en detalle en el artículo Python en la Web con Nginx+uWSGI+Flask.

Finalmente, instalar el cronjob para correr el script cronjob.py que se encarga de recolectar las estadísticas:

$ crontab -e

Por ejemplo si se desea correr una vez por día a las 7:15 de la mañana:

15 07 * * * /usr/local/flask/cronjob.py

Interfaz de la aplicación

La aplicación tiene un dashboard con el estado de todos los datastores:

Por cada datastore es posible ver el detalle de uso por máquina virtual y un reporte de la evolución de uso:

El reporte de la evolución de uso está en fase beta alpha, ya que la idea es poder seleccionar fechas y generar reportes personalizados. De momento genera una gráfica con todas las estadísticas encontradas (de mínima tengo que agregar una cláusula LIMIT en la consulta SQL y ordenar por fecha para obtener sólo los últimos datos):

En datastores de gran tamaño no es posible apreciar con claridad la evolución de uso al utilizar una escala lineal, por ende es posible cambiar a una escala relativa entre los valores extremos:

Tal vez algún SysAdmin administrando VMware se pueda animar a probarlo y por qué no aportar mejoras, como por ejemplo soporte para otros mecanismos de autenticación.

De todas formas (más allá de que no le sea útil a nadie más que a mí o la organización en la que trabajo) es una muestra de lo que se puede llegar a lograr con unas pocas líneas de Python gracias a pyVmomi. Una solución a tener muy en cuenta de aquí a futuro, sin dudas.

Otro punto a destacar es la facilidad para desarrollar aplicaciones Web con Flask.


Tal vez pueda interesarte


Compartí este artículo