En artículos anteriores demostré cómo comenzar a trabajar con pyVmomi y compartí mi primer script Python con pyVmomi. Ahora desarrollé un nuevo script que permite listar el uso de datastores por cada máquina virtual en un host VMware ESX/ESXi/vCenter.

Tal como mencioné al trabajar con datos JSON en PostgreSQL, esta serie de artículos no es casual o caprichosa. Sino que se trata de la documentación que surge del desarrollo de una pequeña aplicación Web en lenguaje Python que permita generar, visualizar y generar reportes a partir de una estadística de uso de datastores (disco, en criollo) de un host o cluster de máquinas virtuales VMware.



El script que he desarrollado se llama vm_datastore_usage.py y lo he subido a mi repositorio de scripts en mi cuenta de GitHub:

scripts/pyVmomi at master - linuxitux/scripts

Analicemos las partes más importantes del código del script.

Luego de establecer con éxito la conexión con el host o cluster de máquinas virtuales VMware (utilizando la función SmartConnect, perteneciente al objeto connect del módulo pyVim), el primer paso consiste en recuperar todas las máquinas virtuales (objetos de clase VirtualMachine):

        objview = content.viewManager.CreateContainerView(content.rootFolder,
            [vim.VirtualMachine],
            True)
        vms = objview.view

Por cada máquina virtual, sólo me interesa recuperar el uso de disco de aquellas que estén actualmente encendidas (en estado poweredOn). Este dato se obtiene del argumento powerState del tipo enumerado VirtualMachinePowerState, perteneciente al objeto runtime (de la clase VirtualMachineRuntimeInfo):

        for vm in vms:
            vm_name = vm.config.name
            if vm.runtime.powerState == vim.VirtualMachine.PowerState.poweredOn:
                # Sólo recuperar datos de máquinas encendidas

Cada máquina virtual almacena el espacio en disco actualmente en uso (committed) junto con el espacio adicional potencialmente utilizado, de acuerdo al total asignado al/los disco/s (uncommitted). Esto corresponde a aquellos discos virtuales que utilizan una asignación de espacio dinámica.

Ambos valores se encuentran dentro del objeto perDatasoreUsage (perteneciente a la clase VirtualMachineUsageOnDatastore). De los cuales existe uno por cada datastore que la máquina virtual hace uso (objeto storage de clase VirtualMachineStorageInfo):

                print("%s:" % vm_name)
                for ds in vm.storage.perDatastoreUsage:
                    print(" |- %s: %s + %s" % (ds.datastore.info.name,
                                               print_size(ds.committed),
                                               print_size(ds.uncommitted)))

Veamos ahora un ejemplo del script en acción:

root@hal9000:/usr/local/pyvmomi-community-samples/samples # ./vm_datastore_usage.py -s vcenter5 -u usr_readonly -p 1234 -S
Datastore usage per virtual machine (commited + uncommited)
-----------------------------------------------------------
test-db-mysql56:
 |- ds-emc2-back: 32.6 GB + 9.0 GB

elearn-testing:
 |- ds-development: 121.7 GB + 124.1 GB
 |- ds-emc2-back: 74.6 GB + 100.0 GB

bigdata-devel:
 |- ds-emc2-back: 46.6 GB + 65.6 GB

elearn-test:
 |- ds-prod2: 84.0 GB + 183.1 GB

deb9:
 |- ds-development: 21.4 GB + 162.7 GB
 |- ds-emc2-back: 7.1 GB + 24.9 GB

test-glassfish:
 |- ds-development: 140.2 GB + 12.9 GB

devel_deb7:
 |- ds-development: 58.7 GB + 545.0 MB

devel_deb8:
 |- ds-development: 114.7 GB + 5.4 GB

test_centos7:
 |- ds-production: 39.5 GB + 108.7 GB

erp-devel:
 |- ds-development: 8.4 GB + 10.8 GB
 |- ds-emc2-back: 651.0 MB + 63.4 GB
 |- ds-prod2: 12.5 GB + 37.5 GB

www-devel_deb7:
 |- ds-emc2-back: 16.0 GB + 1.2 GB

www-devel:
 |- ds-emc2-back: 38.6 GB + 2.3 GB

www2-devel:
 |- ds-emc2-back: 57.0 GB + 2.2 GB

db-devel:
 |- ds-production: 102.5 GB + 9.7 GB

ns1:
 |- ds-prod2: 5.6 GB + 27.5 GB

dom_test:
 |- ds-development: 8.3 GB + 12.3 GB

test-bigdata:
 |- ds-development: 48.4 GB + 3.7 GB

erp-test:
 |- ds-development: 9.3 GB + 1.3 GB

vCenter5:
 |- ds-development: 57.6 GB + 50.5 GB

devel2:
 |- ds-development: 53.8 GB + 66.3 GB

centos7:
 |- ds-production: 4.0 GB + 492.0 bytes
 |- ds-prod2: 185.9 GB + 40.2 GB

ns1-devel:
 |- ds-development: 28.3 GB + 19.3 GB

ns2-devel:
 |- ds-development: 52.7 GB + 84.4 GB

ns2:
 |- ds-emc2-back: 104.3 GB + 7.8 GB

elearn-devel:
 |- ds-development: 15.9 GB + 714.0 MB

devel-web:
 |- ds-development: 39.4 GB + 3.2 GB
 |- ds-emc2-back: 57.1 GB + 42.9 GB

Por otro lado, si se utiliza el parámetro -j, es posible obtener esta misma salida en formato JSON agrupando las máquinas virtuales por datastores (a fin de organizar la información de forma más conveniente).

Referencias


Tal vez pueda interesarte


Compartí este artículo