Parar VMs con PowerCLI de forma masiva y programada

Con PowerCLI se pueden hacer multitud de cosas contra una infraestructura vSphere. Yo partifcularmente disfruto especialmente con las que me ayudan a lograr que la infraestructura se mantenga controlada a lo largo de los meses puesto que, como he dicho muchas veces por aquí, conseguirlo se vuelve cada vez más difícil según vas sumando manos que la administren u operen con ella. En anteriores entradas hemos visto, por ejemplo, cómo controlar las VMs sin VMware Tools o con snapshots antiguos, y en la entrada de hoy veremos cómo parar VMs con PowerCLI que se supone que no deberían estar corriendo de forma perpetua.

Parar VMs con PowerCLI

¿Por qué parar VMs con PowerCLI?

Existen varios motivos por los que querríamos automatizar la parada de VMs con PowerCLI:

  • Asegurarnos de que VMs no productivas no consuman los recursos de las que sí lo son.
  • Parar VMs que no se utilizan durante todas las franjas horarias.
  • Controlar el gasto de nuestra infraestructura de pago por uso generado por nuestras máquinas de test.

En nuestro caso fue la última de las opciones la que nos hizo implementar esta medida, puesto que tenemos una carpeta de vSphere de test donde muy frecuentemente las máquinas quedaban encendidas después de su último uso durante semanas o meses, incurriendo en costes de licenciamiento en nuestra infraestructura absolutamente innecesarios.

Cmdlets implicados

Realizar esta automatización nos llevará muy pocas líneas de código. Para parar las máquinas virtuales nos valdremos de dos cmdlets de PowerCLI:

  • Shutdown-VMGuest: Para parar máquinas virtuales con VMware Tools «de forma amigable».
  • Stop-VM: Para parar máquinas virtuales sin VMware Tools, en este caso de forma un poco más «agresiva».

Manos a la obra

Ya podemos empezar a construir el script. Primero definiremos un área de configuración:

#### Configuración ####
# Conexión a vCenter
$VcenterIp = "192.168.168.168"
$VcenterCreds = Import-Clixml -Path "$PSScriptRoot\Credenciales\VMware.xml"
# Carpetas con VMs de pruebas
$VmFolders = 'Test','Pruebas'

Nada que no hayamos hecho varias veces en entradas del blog, pero vamos a repasarlo:

  • Líneas 3-4: Definimos los parámetros de conexión a vCenter, IP del servidor y las credenciales tal como vimos en entradas anteriores.
  • 6: Definimos las distintas carpetas de vSphere que querremos parar.

Y ahora podemos pasar a la acción:

#### Cuerpo ####
# Conectamos al vCenter
Connect-VIServer -Server $VcenterIp -Credential $VcenterCreds -WarningAction SilentlyContinue | Out-Null

# Recorremos las carpetas
ForEach ($VmFolder in $VmFolders) {
    # Obtenemos las VMs encendidas
    $VMs = Get-Folder $VmFolder | Get-VM | Where-Object PowerState -eq 'PoweredOn'
    # Recorremos las VMs
    ForEach ($VM in $VMs) {
        # Obtenemos el estado de las tools
        $VmTools = $VM.ExtensionData.config.tools.toolsVersion

        # Apagamos forzosamente si no hay tools o amigablemente si sí que hay
        If ($VmTools -eq 0) {
            $VM | Stop-VM -Confirm:$false
        }
        Else {
            $VM | Shutdown-VMGuest -Confirm:$false
        }
    }
}

# Desconectamos del vCenter
Disconnect-VIServer -Confirm:$false

Aquí ya tenemos algo más que explicar:

  • Línea 3: Conectamos a la infraestructura vSphere con los datos de la sección de configuración.
  • 6-22: Recorremos las carpetas de VMs definidas en la sección de configuración.
    • 8: Obtenemos todas las VMs encendidas de la carpeta.
    • 10-20: Recorremos las VMs una a una.
  • 25: Desconectamos de la infraestructura.

Como siempre, programaremos la ejecución del script de PowerShell como habitualmente y lo ajustaremos a la periodicidad con la que queremos que se apaguen las VMs, en el caso de las VMs de test nosotros las apagamos cada noche.

Conclusión

A partir del script que os propongo podéis realizar las modificaciones que a vosotros os vengan bien, apagando VMs concretas y no carpetas, apagando todas las VMs de un servidor… Como siempre el límite es nuestra imaginación.

Espero que el script os sea de ayuda. ¡Hasta la próxima!

Deja un comentario