Introducción a PowerCLI

Una de las cosas que a menudo nos preocupa es el tiempo que perdemos configurando y gestionando nuestra infraestructura. Dedicamos días o incluso meses estudiando y valorando la mejor opción de hardware que se ajusta a nuestra carga de trabajo para reducir al máximo el tiempo que necesito dedicarle de cara al futuro. Pero… ¿qué pasa con el resto de tareas?

Almacenamiento definido por software, redes virtuales, VDI… todo eso está genial, pero ¿por qué no ahorrarnos tiempo también en ciertas tareas de despliegue y gestión?

Este artículo sirve como guía para enseñar a instalar el módulo PowerCLI en PowerShell, conectarnos al vCenter Server o host ESXi y nos enseña a automatizar tareas en nuestro entorno de virtualización con VMware. Desde aquellas que implican directamente al host hasta las relacionadas con máquinas virtuales y plantillas.

Requisitos previos

Windows Powershell pone a nuestra disposición un conjunto de módulos para gestionar y ver nuestro entorno VMware: PowerCLI. Puede utilizarse para recopilar información detallada y ejecutar comandos desde host a máquinas virtuales, datastores o dispositivos de red.

Para ello, primero tenemos que cumplir una serie de requisitos en cuanto a versiones:

VMware PowerCLI 11.5.0 es compatible con las siguientes versiones de PowerShell:

  • Windows PowerShell 4.0
  • Windows PowerShell 5.0
  • Windows PowerShell 5.1
  • PowerShell Core 6.x (Ubuntu y macOS)

Además, antes de instalar PowerCLI debes tener instalados en la misma máquina:

Introducción a PowerCLI

Para empezar a utilizar PowerCLI, tendríamos que instalar el módulo para que se integren los comandos o, como se llaman en PowerShell, commandlets (cmdlet). Vamos a tener más de 700 cmdlets para realizar tareas en VMware.

Abrimos PowerShell en nuestra VM Windows o servidor Windows desde donde nos vamos a conectar a vCenter y ejecutamos el comando para instalar el módulo.

 Install-Module -Name VMware.PowerCLI 

Damos permiso y aparecerá el avance de instalación:

Una vez instalado podemos comprobar que los módulos se han instalado correctamente en:

C:\Program Files (x86)\WindowsPowerShell\Modules

Cada cmdlet consiste en un Verbo+Sustantivo. Los cmdlets disponibles son los siguientes:

  • Get – para extraer información
  • Start – para ejecutar o iniciar
  • Out – para dar salida
  • Stop – parar un proceso
  • Set – establecer parámetros
  • New – crear objetos

Como es imposible saber todos los comandos de memoria, utilizaremos Get-Command para enumerar los comandos según lo que nos interese. Por ejemplo:

  • Enumerar comandos que tengan el mismo verbo:

Get-Command -Verb [nombre del verbo]

Get-Command -Verb Get 
  • Mediante el objeto sobre el que queremos actuar saber qué verbos (acciones) hay disponibles:

Get-Command -Noun [nombre del sustantivo]

Otra alternativa va a ser abrir PowerShell ISE, desde donde vamos a poder ejecutar comandos y escribir, probar y depurar scripts en una única GUI. Desde aquí vamos a poder ver a la derecha un listado de los comandos integrados con VMware disponibles.

Recomiendo usar esto último ya que además nos va a facilitar mucho a la hora de crear y ejecutar scripts.

Vamos a ver un ejemplo. Voy a crearme un script que simplemente muestre por pantalla un mensaje.

Lo guardo (con extensión .ps1) y ejecuto con el botón Run o F5.

Secuencia de comandos básicos de PowerCLI

Lo primero de todo para poder realizar cualquier tarea en nuestro entorno VMware va a ser conectarnos al vCenter en el caso de querer gestionar clusters o a un ESXi para gestionar solo ese host. Para ello vamos a ejecutar el comando:

Connect-VIserver –server [IP/nombre de vCenter Server o ESXi]

Lo siguiente que nos pedirá son las credeciales de acceso. Rellenamos con el usuario y la contraseña como lo haríamos desde interfaz gráfica. De forma alternativa, podemos especificarlas como argumento del comando.

Ahora que ya estamos dentro y tenemos acceso completo a las VMs podemos empezar a ejecutar comandos para ver nuestro entorno. Son muy intuitivos.

  • Get-VM nos va a listar todas las que VMs que se ejecutan en nuestro entorno. Podemos especificar parámetros para que filtre por cluster, host, datastore…

Vamos a poder ver información como el estado (apagada o encendida) y los recursos que utiliza (vCPUs y memoria)

  • Para ver información más detallada, como el sistema operativo invitado, los grupos de recursos, la versión del hardware de la VM, la carpeta en la que se encuentra y otros detalles podemos añadir: Get-VM | fl 
  • Para filtrar VMs y seleccionar la información específica que queremos consultar,podemos usar un where-object e igualar a lo que nos interesa. Por ejemplo, para que muestre solo las que están apagadas igualaremos con -eq (equal):
Get-VM | where-object {$_.PowerState –eq “PoweredOff”}
  • Vamos a poder incluso actuar sobre el resultado del comando anterior y encenderlas directamente con el cmdlet Start-VM.
Get-VM | where-object {$_.PowerState –eq “PoweredOff”} | Start-VM

Estos son algunos ejemplos para entender qué acciones podemos ejecutar y sobre qué objetos VMware. Pero lo interesante es poder aprovechar esta integración para realizar tareas repetitivas mediante un script y no tener que hacerlo manualmente desde la GUI de vCenter cada vez que lo necesitemos.

Un ejemplo que en nuestro caso se produce mucho es el hecho de clonar o crear VMs en bloque para la realización de laboratorios para el usuario. Desde la GUI tendría que irme a la VM o plantilla desde la que quiero crear e ir rellenando 1 a 1 para cada VM que necesite.

Con PowerCLI vamos a poder escribir el código necesario para que cuando ejecutemos el script simplemente tengamos que meter por teclado el nº de VMs que quiero crear y el nombre que les voy a dar. En nuestro caso van a seguir un patrón para que se numeren:0X + nombre de VM siendo X el nº que corresponde a esa VM. Se crearán en un datastore de nombre «ds-labsynergy«

En el caso de querer crearlas desde una plantilla, se me van a listar las que tengo disponibles en la carpeta «Laboratorios» y meteré por teclado la que me interesa, o directamente puedo especificarlo si siempre las creo desde la misma, como en el ejemplo:

Connect-VIServer vsanvc.plds.es -user [...] -Password [...]

$val=0

[string] $nombre = read-host "Nombre de grupo de VM a crear:"

Write-Host "-----Plantillas disponibles-----"
get-template -Location Laboratorios

#$plantilla = Read-Host "Nombre de la plantilla desde la que quiero crear:"
$number = read-host "Numero de VMs a crear:"

while ($val -ne $number){
    $fullname = "0" + $val + "_" + $nombre

    #Si quiero especificar el nombre de la plantilla en vez de preguntar por pantalla
    $templateName = 'Temp-HPOV5-Synergy-DCS'
    
    #Si quiero especificar el nodo donde quiero crearme las VMs
    #$esxName = '10.1.9.232'

    $clusterName = "BladeCluster"
    $folderName = 'OneView'
    $dsName = "ds-labsynergy"
    $template = Get-Template -Name $templateName
    #$template = Get-Template -Name $plantilla
    $ds = Get-Datastore -Name $dsName
    $cluster = Get-Cluster -Name $clusterName
    #$esx = Get-VMHost -Name $esxName
       

    $vm = New-VM -Template $template -Name $fullname -ResourcePool $cluster -Location $folderName -Datastore $ds -DiskStorageFormat Thin -Confirm:$false
    
    #Si no quiero crearlas desde plantilla tengo que configurarlas

    <#|
    Set-VM -NumCpu 2 -MemoryGB 4 -Confirm:$false 
    Get-HardDisk -VM $vm | Set-HardDisk -CapacityGB 100 -Confirm:$false
    #>

    Write-Host "Se ha creado la VM con nombre $fullname"
    
  $val++         
}

Una vez rellenados los campos necesarios ya podríamos ver el proceso de creación de las VMs, que inmediatamente aparecerían en vCenter.

Este era solo un ejemplo de las tareas que podemos automatizar en nuestro día a día, pero vamos a poder realizar cualquiera que se nos pase por la cabeza y ahorrarnos mucho tiempo de cara al futuro.

Comparte este artículo

Deja un comentario

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