En este post vamos a analizar como ejecutar comandos «esxcli» contra un host desde PowerCLI. En ocasiones podemos encontrarnos con la necesidad dentro de un script de ejecutar comandos de esxcli contra un ESXi. En ocasiones es mucho más rápida su ejecución, como por ejemplo si queremos realizar el montaje de un Datastore en un Cluster de ESXi, es mucho más rápida la ejecución, que si usamos los cmdlet de PowerCLI.
Para cargar la API de esxcli desde PowerCLI, tenemos que hacer uso del cmdlet «Get-EsxCli», al cuál pasaremos como parámetro el Host ESXi sobre el cuál queremos ejecutar los comandos de esxcli. A continuación podemos ver como cargar la API para esxcli:
$esxcli = Get-EsxCli -VMHost (Get-VMHost -Name "MyESXi") -V2

Como vemos también añadimos la versión de esxcli «V2». Una de las diferencias más evidentes de esta versión, es la posibilidad de pasar los parámetros necesarios, sin tener que pasar $null para todos los parámetros. Para conocer que parámetros tenemos que especificar para ejecutar un parámetro, e incluso podemos asignar valor a los parámetros. Por ejemplo, queremos realizar el montaje de un Datastore sobre un ESXi, para ello lo haremos de la siguiente manera.
Primero vamos a ver que argumentos podemos pasar a la ejecución para el montaje del Datastore:
$argumentos = $esxcli.storage.filesystem.mount.CreateArgs()

Como podemos observar, todos los argumentos son opcionales y podemos interpretar que tipo de objeto necesita (string, boolean, number,etc). En este caso necesitamos darle valor al parámetro «volumelabel», que será el nombre del Datastore que queremos montar. Como hemos guardado en una variable un array de objetos, podemos asignar valores a los parámetros de la siguiente manera:
$argumentos.volumelabel = "MyDatastoreToMount"
Perfecto, ahora ya tenemos asignado el valor al parámetro que utilizaremos para invocar al comando «mount».

Para lanzar el comando de montaje, lo ejecutaremos con «Invoke()». A esta invocación para el comando, le pasaremos el array de objetos, al cuál le hemos asignado valores.
$esxcli.storage.filesystem.mount.Invoke($argumentos)
Esto realizará el montaje del Datastore pasado como parámetro en el Host sobre el cual hemos cargado la API de esxcli.
Otra forma de pasar parámetros para invocar el comando a ejecutar:
$esxcli.storage.filesystem.mount.Invoke(@{volumelabel="MyDatastoreToMount"})
A continuación os dejo algunos ejemplos más:
# Create Portgroup $esxcli.network.vswitch.standard.portgroup.add.Invoke(@{portgroupname = ‘PG-Just2Kloud’; vswitchname = ‘Just2Kloud_VSS’}) # Ejecutar un Rescan Storage sobre un Host ESXi $rescanHba = $esxcli.storage.core.adapter.rescan.Invoke(@{all = $true}) $rescanVMFS = $esxcli.storage.filesystem.rescan.Invoke() # Configuración Syslog en un Host ESXi $fd_syslog = "Just2Kloud_ESXi01_Scratch" $esxcli.system.syslog.config.set.Invoke(@{logdir = $fd_syslog; logdirunique = 'true'}) # Activamos Regla Firewall $esxcli.network.firewall.ruleset.set.Invoke(@{rulesetid = "syslog"; enabled = "true"}) # Realizamos un refresh de las reglas de firewall $esxcli.network.firewall.refresh.Invoke() # Realizar el resignature sobre un Datastore $esxcli.storage.vmfs.snapshot.resignature.Invoke(@{volumelabel = "DS_Just2Kloud"})
Espero que os sea de utilidad. Gracias por compartir 😉