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
Gracias por compartir 😉