Como detectar el sistema operativo real instalado en máquinas virtuales (VM) en ESXi (vía vCenter)

Nota: Todas las configuraciones indicadas en este post fueron realizadas sobre un hypervisor VMWare ESXi 6.0 usando ademas vCenter. Es probable que los pasos sean diferentes para otras versiones de hypervisor/vCenter.

Intro

En un proyecto para un cliente estábamos en el proceso de detectar las máquinas virtuales creadas en los diferentes hypervisores ESXi.

Escenario:

  • Múltiples servidores vCenter para administrar subconjuntos de chasis ESXi
  • Múltiples sistemas operativos tanto Windows, Linux y embebidos
Decidimos abordar el la detección consultando la configuración de cada VM en cada vCenter. Al ir bajando a detalle encontramos que no era tan directo como parecía inicialmente.

Debíamos actualizar el listado de máquinas periódicamente, por lo que no era viable hacer esta tarea de manera manual. Pusimos manos a la obra para desarrollar un script en powershell para dejarlo planificado como tarea programada.

El script inicial

Para conectar con los diferentes componentes vSphere fue necesario instalar los cmdlets de powercli [1]. PowerCLI extiende la funcionalidad de powershell con más de 600 cmdlets que permiten gestionar y automatizar entornos basados en productos de VMWare.

Para poder incorporar la funcionalidad debe importarse el módulo al inicio del script:

import-Module VMware.PowerCLI

La conexión hacia un servidor vCenter o chasis ESXi requiere de algunos comandos

$pass = “**************”
$usuario = “midominioAD\control”
$vcenter = ‘mivcenter1’
connect-VIServer -Server $vcenter -User $usuario -Password $pass

Luego habrá que ciclar sobre las máquinas virtuales existentes en ese vCenter:

$resultado= @()
foreach($vm in Get-View-ViewType Virtualmachine)
{
   $vms = “” | Select-Object VMName,Hostname, IPAddress, OS
   $vms.VMName = $vm.Name
   $vms.Hostname = $vm.guest.hostname
   $vms.IPAddress = $vm.guest.ipAddress
   $vms.OS = $vm.Config.GuestFullName
   $resultado += $vms
}

Hasta aquí es lo que probablemente encontrarán en muchos lugares en Internet. La cuestión es que casi todos los ejemplos que verán toman la versión del sistema operativo del atributo Config.GuestfullName de la máquina virtual, lo que en la práctica pudimos comprobar que no es un dato fiable.

El problema

Analizando a mano varios casos de una muestra pudimos detectar que el sistema operativo reportado por el script no coincidía con el que efectivamente estaba instalado en la máquina virtual.

¿Por qué? Después de algo de investigación y varias pruebas, lo que pudimos determinar es que es probable que el valor config.GuestFullName se configure al crear la máquina virtual y por alguna razón no se actualice, por lo que no necesariamente coincide con la versión del sistema operativo efectivamente instalado. Esto tiene diversas implicancias administrativas desde el punto de vista de VMWare (que no vienen al caso en este post, pero que trataremos de resolver o al menos detectar).

Por lo que pudimos investigar:

  • Los datos de config.XXXX de una VM provienen del objeto “VirtualMachineConfigInfo”[2] que en definitiva es la información almacenada en el archivo .VMX de la máquina virtual.
  • Los datos de guest.XXXX de una VM provienen del objeto “VirtualMachineGuestSummary”[3] que es la información provista por las VMTools instaladas en el sistema operativo guest.

La solución (detectando las diferencias)

Ya con más idea de lo que estaba pasando pude encontrar un script que identifica estas diferencias [4], al cual le modifiqué el tipo de salida para algo más adaptado a mi necesidad de reporting.

Get-View -ViewType “VirtualMachine” -Property @(“Name”, “Config.GuestFullName”, “Guest.GuestFullName”) | Where-Object {($_.Config.GuestFullName -ne $_.Guest.GuestFullName) -and ($_.Guest.GuestFullName -ne $null)} | Select-Object -Property Name, @{N=“ConfiguredOS”;E={$_.Config.GuestFullName}}, @{N=“RunningOS”;E={$_.Guest.GuestFullName}} | Export-Csv reporte.csv -NoTypeInformation -UseCulture

Con este reporte podremos saber que máquinas virtuales requieren una corrección en la configuración, para que el sistema operativo instalado coincida con la información de configuración de la máquina virtual.

Comentarios finales

A veces el código disponible en algunos sitios parece solucionar nuestra necesidad, pero no es así. Es importante hacer chequeos contra la realidad para determinar si los datos son completamente coherentes, puesto que podemos llevarnos algunas sorpresas.

Si algo no cierra siempre es divertido investigar, para determinar que puede estar pasando, en este caso me sirvió para aprender algo nuevo y espero que a ustedes les sirva ;-).

Referencias:

[1] PowerCLI: https://code.vmware.com/web/dp/tool/vmware-powercli/

[2] https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.ConfigInfo.html

[3] https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.Summary.GuestSummary.html

[4] http://vcdx56.com/2013/08/use-powercli-to-compare-virtual-machine-configured-and-installed-guest-operating-system/

1 comentario

  1. Gonzalo Leon

    Muy gross!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *