Power cli: script para mover máquinas virtuales de datastore

VMWare ESXi
VMWare ESXi

Utilizando powershell, podemos hacer un pequeño script que nos libere un datastore completo, moviendo las máquinas virtuales que residen en él a una nueva ubicación.

Además,  desmontamos las vmware tools, si están montadas, como indican en las communities de vmware.

Function migrate_ds  ([string] $old_ds, [string] $new_ds)
{            $vms = Get-VM -Datastore $old_ds
            foreach ($vm in $vms) {  
                    # unmount tools and clean cd drive 
                    $vm | Get-CDDrive | where { $_.IsoPath -or $_.HostDevice -or $_.RemoteDevice } | Set-CDDrive -NoMedia -Confirm:$false
                    $vm  | move-VM -Datastore $new_ds
            
            }
}

migrate_ds my_old_ds my_new_ds

Powercli – Clonar varias máquinas a la vez

Queremos clonar de forma automática un número de máquinas, con un patrón concreto. Para ello, hemos usado de powershell:

  • -Match
  • -notmatch

La autentación contra vcenter está fuera del script. Debe hacerse antes de llamarlo.

Al no tener resource pools configurados, la nueva máquina, debe dejarse en el resourcepool “Resources”. Con get-resourcepool podemos consultar cuáles tenemos disponibles en nuestra arquitectura.

# Basado en http://vmwaremine.com/2013/05/28/powercli-clone-vm/
#
# Ester Niclos Ferreras
# Last updated: 29/2/14

# PRe: connect-viserver vc

#
# SourceVM:
#
$vmlist= get-vm pattern* | WHERE   { $_.Name -notMatch “no_pattern” }

$datastore = Get-Datastore “my_datastore”
$folder = get-folder “my_folder” -Location “my_datacenter”
$respool = get-ResourcePool Resources -Location “manvmecluster”

foreach ( $sourceVM in $vmlist) {
$cloneName = $sourceVM.Name +’-clone’

#write-host $sourceVM $cloneName $datastore  $folder

if (New-VM -Name $cloneName -ResourcePool $respool -VM $sourceVM -Location $folder -Datastore $datastore -DiskStorageFormat Thin )
{“DONE”}
else
{“Something wrong with cloning”}
}

 

Powershell. Función para saber la tasa de transmisión. Velocidad de red

Función para calcular la tasa de copia en MBps de una carpeta a otra. Usado para carpetas de red.

 

Es importante contar con el -Recurse en la función Get-ChildItem $destDir/ -Recurse. Sin ello, no se tienen en cuenta los contenidos de carpetas anidadas.

Existen errores reportados sobre el cmd-let remove-item. Por ello, la línea de borrado se pasa desde un get-childitem.

Function Copy_Folder ($src, $destDir)
{
# Remove old data:
get-childitem $destDir\* -recurse | remove-item -recurse -force

# Create destination:
if (!(Test-Path -path $destDir))
{ New-Item $destDir -itemtype directory -force }
# Copy files:
$date1=Get-Date
copy-item $src $destDir\ -force -recurse -verbose
$date2=Get-Date
# $date1 and $date2 some dates, dates difference:
$duration=($date1-$date2).duration()
# Size of data
$datasize = (Get-ChildItem $destDir/ -Recurse | Measure-Object -property length -sum).sum / 1MB
$mb=”{0:N2}” -f ($datasize) + “MB”
# Transmission rate
$transmision_rate=”{0:N2}” -f ($datasize / ($duration.TotalSeconds)) + “MBps”
$log_line=”`n $src $duration secs $mb $transmision_rate ”
Add-Content $log $log_li$src=ne
Write-host $log_line
}