Contents

Redimensionar una máquina virtual de forma programada con PowerCLI

Una de las tareas habituales dentro de una plataforma vSphere es la de redimensionar máquinas virtuales existentes. Si queremos aumentar recursos es probable que con CPU/Memory Hot Add tengamos suficiente para no tener una parada de servicio, pero si dichos settings no están habilitados en nuestra VM o lo que queremos es disminuir los recursos de la máquina sí que la tendremos. En la entrada de hoy veremos cómo redimensionar una máquina virtual de forma programada con PowerCLI para poder ajustar nuestra parada de servicio a horas no productivas.

/wp-content/uploads/2019/03/Redimensionar-una-máquina-virtual-de-forma-programada-con-PowerCLI.png
Redimensionar una máquina virtual de forma programada con PowerCLI

Construyendo el script

Si no te interesa el proceso detallado de la creación del script puedes pasar directamente al siguiente punto. ;-)

Antes de empezar a construir un script, por simple que sea, recomiendo siempre planear las acciones que vamos a realizar en el mismo. Para este caso serán las siguientes:

  • Conectar a vSphere.
  • Apagar la máquina virtual (si recurrimos a este método probablemente es porque no podemos tirar de Hot Add).
  • Comprobar que la máquina llegue a apagar. (si intentáramos redimensionar la máquina estando encendida obtendríamos un error)
  • Redimensionar la máquina virtual.
  • Encender la máquina virtual.
  • Desconectar de vSphere.

Nada muy complejo, así que con un script de pocas líneas lo tendremos resuelto. Para empezar crearemos una pequeña zona de configuración del script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#### Configuración del script ####
# Conexión a vCenter
$VcenterIp = '192.168.168.168'
$VcenterCred = Import-Clixml -Path "$PSScriptRoot\Credenciales\VMware.xml"

# Nombre de la máquina virtual a modificar
$VmName = 'Sobrebits01'
# Número de CPUs (Para no modificarlo dejar el valor en '')
$Cpu = '3'
# GBs de RAM (Para no modificarlo dejar el valor en '')
$Memory = ''
  • Líneas 3-4: Datos de la conexión a vCenter. Para almacenar las credenciales utilizamos el método en ésta entrada.
  • 7-11: Configuramos los valores de la máquina virtual. Para las $Cpu y $Memory si dejamos el valor vacío implicará no modificar dicho valor.
  • En este caso de ejemplo modificaríamos la CPU a 3 y dejaríamos la memoria con el valor ya configurado en la máquina.

Con el apartado de configuración finalizado pasamos a conectar al vCenter, apagar la máquina y esperar a que se haya apagado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#### Cuerpo del script ####
# Conectamos al vCenter
Connect-VIServer -Server $VcenterIp -Credential $VcenterCred -WarningAction SilentlyContinue | Out-Null

# Apagamos la máquina virtual
Get-VM $VmName | Shutdown-VMGuest -Confirm:$false | Out-Null

# Esperamos hasta que la máquina se apague
Do {
    Start-Sleep -Seconds 5
    $Vm = Get-VM -Name $VmName
} Until ($Vm.PowerState -eq 'PoweredOff')

Creo que todo es bastante autoexplicativo, pero vamos a verlo por encima:

  • 3: Conectamos a vCenter utilizando la IP y credenciales generadas en el área de configuración.
  • 6: Obtenemos la máquina virtual y la apagamos de forma “amigable” con Shutdown-VMGuest.
  • De no tener las VMware Tools instaladas y activas la máquina virtual no se apagaría. Para hacer un apagado forzoso deberíamos utilizar Stop-VM.
  • 9-12: Ejecutamos el bucle hasta que la propiedad **PowerState **de la máquina virtual no sea PoweredOff.

Con la máquina apagada ya podemos pasar a redimensionar la máquina, iniciarla y desconectar del vCenter:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Redimensionamos en función de lo que hayamos especificado en la configuración
if ($Cpu -and $Memory) {
    Get-VM $VmName | Set-VM -NumCpu $Cpu -MemoryGB $Memory -Confirm:$false | Out-Null
}
elseif ($Cpu) {
    Get-VM $VmName | Set-VM -NumCpu $Cpu -Confirm:$false | Out-Null
}
elseif ($Memory) {
    Get-VM $VmName | Set-VM -MemoryGB $Memory -Confirm:$false | Out-Null
}

# Iniciamos la máquina virtual
Get-VM $VmName | Start-VM | Out-Null

# Desconectamos del vCenter
Disconnect-VIServer -Confirm:$false
  • 2-10: Redimensionamos la máquina virtual con Set-VM en función de los parámetros especificados.
  • 2-4: Si especificamos tanto $Memory como $Cpu modificamos ambas configuraciones.
  • 5-7: Si únicamente hemos especificado $Cpu la modificamos.
  • 8-10: Si únicamente hemos especificado $Memory la modificamos.
  • 13: Iniciamos la máquina virtual con Start-VM.
  • 16: Desconectamos del vCenter.

Script para redimensionar una máquina virtual de forma programada con PowerCLI

El resultado final del script sería el siguiente:

 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
35
36
37
38
39
40
41
#### Configuración del script ####
# Conexión a vCenter
$VcenterIp = '192.168.168.168'
$VcenterCred = Import-Clixml -Path "$PSScriptRoot\Credenciales\VMware.xml"

# Nombre de la máquina virtual a modificar
$VmName = 'Sobrebits01'
# Número de CPUs (Para no modificarlo dejar el valor en '')
$Cpu = '3'
# GBs de RAM (Para no modificarlo dejar el valor en '')
$Memory = ''

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

# Apagamos la máquina virtual
Get-VM $VmName | Shutdown-VMGuest -Confirm:$false | Out-Null

# Esperamos hasta que la máquina se apague
Do {
    Start-Sleep -Seconds 5
    $Vm = Get-VM -Name $VmName
} Until ($Vm.PowerState -eq 'PoweredOff')

# Redimensionamos en función de lo que hayamos especificado en la configuración
if ($Cpu -and $Memory) {
    Get-VM $VmName | Set-VM -NumCpu $Cpu -MemoryGB $Memory -Confirm:$false | Out-Null
}
elseif ($Cpu) {
    Get-VM $VmName | Set-VM -NumCpu $Cpu -Confirm:$false | Out-Null
}
elseif ($Memory) {
    Get-VM $VmName | Set-VM -MemoryGB $Memory -Confirm:$false | Out-Null
}

# Iniciamos la máquina virtual
Get-VM $VmName | Start-VM | Out-Null

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

Conclusión

Si utilizamos éste script junto con lo que vimos anteriormente en Ejecutar un script de PowerShell de forma programada podremos pasar a realizar nuestras redimensiones de máquinas virtuales de forma totalmente desatendida, ahorrándonos acciones manuales fuera de horario, que creo que a ninguno nos gustan. :-)

Eso sí, hay que tener en cuenta que el script no hace comprobaciones posteriores de que el servicio de nuestra máquina virtual levante correctamente, por lo que o lo scriptamos, o lo tenemos monitorizado o habrá que hacer un chequeo manual antes de empezar el horario productivo.

¡Espero que os sea útil!
¡Hasta la próxima!