Utilizando la VMware vSphere API a través de Python con PySphere

Publicado el 09 marzo 2015 por Dbigcloud @dbigcloud

Hace poco os hablé de cómo usar la VMware vSphere API a través de Python con pyVmomi, esta semana he tenido que realizar una serie de scripts, para conseguir información de forma sencilla de un datacenter  y utilizar este módulo de Python era algo engorroso, que no quiere decir difícil. Investigando, me he encontrado con PySphere. Este módulo, simplifica mucho la sintaxis facilitando la forma de interactuar con la API de vSphere, hoy os voy a explicar cómo he realizado un script para determinar si dos máquinas virtuales se encuentran en un mismo host.

La instalación de PySphere es tan sencilla como cualquier otro módulo en Python, puede ser instalado de la siguiente forma:

A través de Easy Install

easy_install -U pysphere

A través de PIP

pip install -U pysphere

O de forma manual

wget https://pysphere.googlecode.com/files/pysphere-0.1.8.zip
unzip pysphere-0.1.8.zip
python setup.py install

Una vez instalado la forma de usar el módulo es importándolo como cualquier otro, por ejemplo el script que he realizado únicamente hace uso del vCenter, por lo que la importación sería de la siguiente forma:

from pysphere import VIServer

Para conectarse al vCenter tendremos que instanciar el VIserver y usar la propiedad connect.

server = VIServer()
server.connect("dbcvcn01.dbigcloud.com", "Administrador", "PASSWORD")

Y para la desconexión:

server.disconnect()

¿Sencillo verdad? Ahora vemos cómo conseguir información de las máquinas virtuales, tenemos dos formas conseguir dicha información que es la siguiente:

Buscando por el nombre de la máquina virtual.

vm1 = server.get_vm_by_name("NombreVM")

Buscando por el Datastore y nombre del vmx de la máquina virtual

vm1 = server.get_vm_by_path("[DataStore1] dbigcloud/dbcubu-10.vmx")

Utilizando este último método obtendremos la información muchísimo más rápida, también si en nuestro vCenter disponemos de diferentes DataCenters podemos pasar el nombre por parámetro.

vm1 = server.get_vm_by_name("NombreVM ", "NombreDatacenter")

Ahora que disponemos de toda la información de la máquina virtual que hemos buscado, os voy a pasar una lista resumida de como conseguir la información:

Conocer el estado de la máquina virtual:

vm1.get_status()

Conocer a que Host está inventariada la máquina virtual

vm1.properties.runtime.host.name

Conocer las propiedades de la máquina virtual

vm1.get_properties()

Con get_properties obtenemos un diccionario (key -> value) con bastante información, para acceder a cada uno de ellos basta con realizar lo siguiente:

vm1.get_property('mac_address')

Como observáis, es muy sencillo trabajar con este módulo y podemos realizar cualquier cosa que la propia API de vSphere nos permita.

Volviendo al asunto del script que tenía que realizar, disponemos de un cluster de ESXi, el cual no tiene DRS habilitado, por lo que no podemos crear reglas de afinidad. Me han pedido que dos máquinas virtuales, las cuales conforman un cluster de Red Hat, estén el mínimo tiempo posible en el mismo host.

Para ello he realizado un script, el cual voy a utilizar en nuestro sistema de monitorización, para que cuando detecte dos máquinas virtuales en el mismo host, envíe una alerta, el cual he llamado check_vmaffinity.py y es el siguiente:

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
from pysphere import VIServer
import sys

server = VIServer()
server.connect("dbcvcn01.dbigcloud.com", "Administrador", "Password")

if len(sys.argv) !=3:
        print "La ejecución del script es la siguiente: ./check_vmaffinity.py NAMEvm01 NAMEvm02"
else:
        nameVM1=sys.argv[1]
        nameVM2=sys.argv[2]

        vm1 = server.get_vm_by_name(nameVM1)
        vm2 = server.get_vm_by_name(nameVM2)
        ### No usamos esta propiedad para determinar el nombre de host ya que tarda mucho en responder
        #print vm1.properties.runtime.host.name

        #Determinamos el id_host de la VM1
        host_id1 = vm1.properties.runtime.host._obj
        #Determinamos el id_host de la VM2
        host_id2 = vm2.properties.runtime.host._obj

        #Creamos un dicccionario con el listado de hosts de nuestro servidor
        #Para posteriormente proporcionar el nombre del host a través del ID obtenido anteriormente
        list_hosts=server.get_hosts()

        if host_id1 == host_id2:
                print "Warning las VM " +nameVM1+ " y " +nameVM2+ " Se encuentran en el mismo host"
        else:
                print "OK la VM "+nameVM1+" se encuentra en el host:" +list_hosts[host_id1]+ " y "+nameVM2+" se encuentran en el host " +list_hosts[host_id2]

server.disconnect()

Como siempre digo hay muchas formas de programar, seguramente el script es bastante mejorable, pero espero que os sea de utilidad y os animéis a programar los vuestros o incluso mejorar éste.