Trabajando con datastores desde PowerCLI

Dependiendo cómo explotemos nuestra infraestructura, es posible que tengamos la necesidad de automatizar operaciones con los Datastores de una plataforma virtual VMware.

Tenemos la opción de trabajarlo con Workflows del Orchestrator, utilizando comandos PowerCLI, o una mezcla de los dos. Más adelante aportaremos ejemplos de Workflows con Orchestrator.

Aporto de momento unas lineas de scripting en PowerCLI para operaciones con datastores, espero que os sirvan.

Desmontar Datastore VMware:

## Definimos el Datastore y cogemos la lista de servidores que lo tienen configurado
$DS = Get-Datastore -name DATASTORE01
$LISTA_ESXi = $DS.ExtensionData.Host

## Comprobamos que esté montado y lo desmontamos
Foreach ($HOST_ESXi in $LISTA_ESXi) {
   $ESXi_VIEW = Get-View $HOST_ESXi.Key
   $STORAGE_SYS_VIEW = Get-View $ESXi_VIEW.ConfigManager.StorageSystem
   Write-Host -nonewline "Desmontando $($DS.Name) en $($ESXi_VIEW.Name)..."
   $STORAGE_SYS_VIEW.RefreshStorageSystem()
   $mounted = $HOST_ESXi.MountInfo.Mounted
   if ($mounted -eq $true) {
      $STORAGE_SYS_VIEW.UnmountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid) | out-null
      }
   else { Write-host "ya está desmontado" }
}

 

Montar Datastore VMware:

## Definimos el Datastore y cogemos la lista de servidores que lo tienen configurado
$DS = Get-Datastore -name DATASTORE01
$LISTA_ESXi = $DS.ExtensionData.Host

## Comprobamos que esté desmontado y lo montamos
Foreach ($HOST_ESXi in $LISTA_ESXi) {
   $ESXi_VIEW = Get-View $HOST_ESXi.Key
   $STORAGE_SYS_VIEW = Get-View $ESXi_VIEW.ConfigManager.StorageSystem
   Write-Host -nonewline "Montando $($DS.Name) en $($ESXi_VIEW.Name)..."
   $STORAGE_SYS_VIEW.RefreshStorageSystem()
   $mounted = $HOST_ESXi.MountInfo.Mounted
   if ($mounted -eq $false) {
    $STORAGE_SYS_VIEW.MountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid) | out-null
   }
   else { Write-host "ya está montado" }
  }

 

Rescan de Hosts en Cluster

Si queremos reescanear los hosts de un clúster en busca de nuevos Datastores desde la interfaz de comandos, tenemos el comando:

## Rescan de VMFS
Get-Cluster -Name $CLUSTER | Get-VMHost | Get-VMHostStorage -RescanVmfs |Out-Null
## Rescan de HBA
Get-Cluster -Name $CLUSTER | Get-VMHost | Get-VMHostStorage -RescanAllHba |Out-Null
## Refresh de storage
Get-Cluster -Name $CLUSTER | Get-VMHost | Get-VMHostStorage -Refresh |Out-Null

El problema viene cuando queremos paralelizar el rescan, es decir, cuando queremos reescanear todos los hosts de un clúster de forma simultánea para ganar tiempo. Normalmente lo solucionaríamos con la opcion de comando “RunAsync“, pero el comando Get-VMHostStorage no nos da esa opción, por lo que se ejecutaría de forma secuencial en los hosts del clúster.

Para saltarnos este problemita de tiempo, hay una opción en PowerShell, y es la de trabajar con jobs en paralelo. Os dejo unas líneas para que veáis cómo lo podemos solucionar, pero hay que tener en cuenta que nos generará una sesión contra el vCenter por cada comando, es decir, por cada ESXi a escanear.

$VCENTER = 'nombre_vcenter'
$USER = 'usuario'
$PASS = 'password'
$VMHosts = Get-Cluster "Nombre_Cluster" | Get-VMHost
foreach ($VMHost in $VMHosts) {
 $Job = Start-Job -ScriptBlock {
 Add-PSSnapin VMware.VimAutomation.Core
 Connect-VIServer -Server $Args[0] -User $Args[1] -Password $Args[2]
 Get-VMHost -Name $Args[3] | Get-VMHostStorage -RescanVMFS
 Disconnect-VIServer -Confirm:$false
 } -ArgumentList @($VCENTER, $USER, $PASS, $VMHost.Name)
}Null