Contents

Corregir VMs con Sistema Operativo invitado mal configurado con PowerCLI

Un error común que podemos encontrarnos en infraestructuras vSphere es el de tener máquinas virtuales cuya versión de Sistema Operativo difiere entre la configurada en ESXi/vCenter y la del SO instalado en la máquina virtual en si. Ésto puede ocurrir en el caso de que se actualice el sistema operativo de la máquina virtual o simplemente por una mala configuración inicial. En la entrada de hoy veremos cómo detectar y corregir VMs con el Sistema Operativo invitado mal configurado con PowerCLI para asegurarnos de tener el mínimo de parada de servicio en el proceso.

/wp-content/uploads/2019/01/Corregir-VMs-con-Sistema-Operativo-invitado-mal-configurado-con-PowerCLI.png
Corregir VMs con Sistema Operativo invitado mal configurado con PowerCLI

Cómo detectar éstas Máquinas Virtuales

El primer paso para acabar con este problema de configuración será detectar exáctamente qué máquinas virtuales están afectadas. Hacerlo máquina por máquina si disponemos de muchas puede ser un proceso tedioso, pero la buena noticia es que con PowerCLI podemos listarlas todas con un solo one-liner (aunque un poco largo):

1
2
3
Get-VM | 
Where-Object {$_.ExtensionData.Config.GuestFullName -ne $_.ExtensionData.Guest.GuestFullName -and $_.ExtensionData.Guest.GuestFullName -ne $null} | 
Select-Object Name,@{N="SO configurado";E={$_.ExtensionData.Config.GuestFullName}},@{N="SO activo";E={$_.ExtensionData.Guest.GuestFullName}}

Vamos a verlo paso por paso:

  • Get-VM: Listamos todas las máquinas virtuales.
  • Where-Object: Filtramos los resultados con las siguientes condiciones:
    • $.ExtensionData.Config.GuestFullName -ne $.ExtensionData.Guest.GuestFullName: Objetos cuyo SO invitado difiera entre el activo y el configurado.
    • $_.ExtensionData.Guest.GuestFullName -ne $null: Objetos cuyo SO activo no esté vacío (máquinas virtuales apagadas o sin VMware Tools).
  • Select-Object: Seleccionamos los campos deseados para el objeto devuelto:
    • Name: El nombre de la máquina virtual.
    • @{N=“SO configurado”;E={$_.ExtensionData.Config.GuestFullName}}: El sistema operativo configurado.
    • @{N=“SO activo”;E={$_.ExtensionData.Guest.GuestFullName}}: El sistema operativo activo.
  • Get-VM: Listamos todas las máquinas virtuales.
  • Where-Object: Filtramos los resultados con las siguientes condiciones:
    • $.ExtensionData.Config.GuestFullName -ne $.ExtensionData.Guest.GuestFullName: Objetos cuyo SO invitado difiera entre el activo y el configurado.
    • $_.ExtensionData.Guest.GuestFullName -ne $null: Objetos cuyo SO activo no esté vacío (máquinas virtuales apagadas o sin VMware Tools).
  • Select-Object: Seleccionamos los campos deseados para el objeto devuelto:
    • Name: El nombre de la máquina virtual.
    • @{N=“SO configurado”;E={$_.ExtensionData.Config.GuestFullName}}: El sistema operativo configurado.
    • @{N=“SO activo”;E={$_.ExtensionData.Guest.GuestFullName}}: El sistema operativo activo.

Si este one-liner no nos devuelve nada quiere decir que no tenemos máquinas virtuales con este problema. En caso de tener máquinas virtuales afectadas veremos una salida parecida a la siguiente:

/wp-content/uploads/2019/01/VMs-mal-configuradas.png
VMs mal configuradas

Como podemos ver en la captura tenemos tres máquinas virtuales mal configuradas, una con WS2012, una con WS2008R2 y otra con WS2008 cuando todas ellas en realidad corren Windows Server 2016.

Si la lista es muy grande y queremos mejorar su manejo podemos exportarla a Excel como vimos en entradas anteriores:

1
Get-VM | Where-Object  {$_.ExtensionData.Config.GuestFullName -ne  $_.ExtensionData.Guest.GuestFullName -and  $_.ExtensionData.Guest.GuestFullName -ne $null} | Select-Object  Name,@{N="SO  configurado";E={$_.ExtensionData.Config.GuestFullName}},@{N="SO  activo";E={$_.ExtensionData.Guest.GuestFullName}} | Export-Excel -Path 'C:\Scripts\SO_mismatch.xlsx' -AutoSize -BoldTopRow -AutoFilter

Con lo que obtendremos nuestro bonito Excel ya filtrado:

/wp-content/uploads/2019/01/VMs-mal-configuradas-Excel.png
VMs mal configuradas Excel

Corregir el Sistema Operativo invitado mal configurado con PowerCLI de forma masiva

Ahora que ya tenemos localizadas las máquinas virtuales que queremos reconfigurar podemos pasar a crear un mini script para arreglar nuestro problema. Lo que queremos que haga nuestro script es lo siguiente:

  • Apagar la máquina virtual a reconfigurar (el cambio debe hacerse en frío).
  • Cambiar el sistema operativo configurado por el correcto.
  • Volver a encender la máquina virtual.

Nada muy complicado, esto es lo que os propongo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#### Variables ####
# Conexión a vCenter
$vcenterIp = "192.168.168.168"
$vcenterCreds = Import-Clixml -Path "$PSScriptRoot\Credenciales\VMware_rw.xml"

# Obtenemos VMs
$vmNames = 'Test-1','Test-2','Test-3'

#### Cuerpo script ####
# Conectamos al vCenter
Connect-VIServer -Server $vcenterIp -Credential $vcenterCreds -WarningAction SilentlyContinue | Out-Null

# Recorremos las VMs
ForEach ($vmName in $vmNames) {
    # Obtenemos la VM
    $vm = Get-VM -Name $vmName
    # Apagamos la VM
    $vm | Shutdown-VMGuest -Confirm:$false | Out-Null

    # Esperamos hasta que la VM se apaga
    do {
        Start-Sleep -Seconds 5
        $vm = Get-VM $vm.Name
    } until ($vm.PowerState -eq 'PoweredOff')

    # Modificamos el Guest ID de la VM
    $vm | Set-VM -GuestId windows9Server64Guest -Confirm:$false | Out-Null
    Start-Sleep -Seconds 5
    # Iniciamos la VM
    $vm | Start-VM -Confirm:$false | Out-Null
}

# Cerramos conexión
Disconnect-VIServer -Confirm:$false

Si bien el script tiene comentarios bastante explicativos voy a desarrollarlo un poco más:

  • 3-4: Definimos los datos de conexión al vCenter.
  • $vcenterIP: IP de nuestro servidor.
  • $vcenterCreds: Un xml con nuestras credenciales tal y como vimos en la entrada ‘Cómo gestionar las credenciales de un script de PowerShell’.
  • 7: Definimos los nombres de los servidores a corregir.
  • 11: Conectamos a vCenter.
  • 14-31: Recorremos las VMs a corregir y:
  • 18: Apagamos la VM.
  • 20-24: Esperamos hasta que la VM haya finalizado el apagado.
  • 27: Configuramos el Sistema Operativo invitado correctamente.
  • 30: Encendemos la VM.
  • 34: Desconectamos del vCenter.

En la línea 27 veréis que utilizo ‘windows9Server64Guest’ para configurar Windows 2016 Server de 64 bits en la máquina virtual. Existe una lista con todos los códigos que podéis utilizar para cada sistema operativo a corregir. Deberéis sustituir éste código por el correspondiente de la versión de sistema operativo que queréis configurar.

Una vez haya finalizado la ejecución de nuestro script si volvemos a ejecutar nuestro one-liner del punto anterior veremos como éstas VMs no aparecen.

Resumen

Es importante mantener la configuración de sistema operativo invitado de forma correcta pues una mala configuración puede provocar problemas de rendimiento, problemas al instalar y actualizar las VMware Tools o imposibilidad de realizar algunos ajustes en las máquinas virtuales.

Debido a que el procedimiento implica parada os recomiendo que programéis una tarea de PowerShell para realizar el proceso fuera de horario de producción para reducir el impacto en vuestros sistemas.