Otro Offtopic, pero no podía dejar de publicar este script de Powershell que hice para distribuir las virtuales en un cluster.
Primero vale aclarar que mis conocimientos de PowerShell son mínimos, y es un lenguaje que me resulta muy difícil de entender y aprender. Vengo del mundo de la programación dura y estructurada, y PowerShell se toma demasiadas "licencias" para mi gusto, por lo que me resulta difícil entender su comportamiento muchas veces.
Aún así hice este sencillo script cuya tarea es bastante simple. Lo que hace es contar el número de maquinas virtuales en un cluster y distribuirlas entre todos los nodos. El "balanceo" no tiene en cuenta recursos, ni nada parecido, es simplemente un conteo de virtuales, pero en mi caso y dentro de nuestra infraestructura resulta bastante útil.
Aquí el script:
Import-Module FailoverClusters
$Cluster=""
$Cluster = Read-Host "Indique nombre del cluster"
$Total=(Get-ClusterResource -cluster $Cluster | where {$_.resourcetype.name -eq "Virtual Machine"}).Count
$Nodos=Get-ClusterNode -cluster $Cluster
$CantNodos=(Get-ClusterNode -cluster $Cluster).count
Write-host "El cluster $Cluster tiene un total de $Total maquinas virtuales a distribuir en $CantNodos nodos."
$Promedio=[MATH]::ROUND($Total/$CantNodos)
Write-host "En total debería haber $Promedio maquinas virtuales por nodo."
Foreach ($Nodo in $Nodos)
{
$PorNodo=(Get-ClusterNode $Nodo.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"}).count
Write-Host "El nodo $Nodo tiene $PorNodo maquinas virtuales"
if ($PorNodo -gt $Promedio)
{
$Diferencia=$PorNodo-$Promedio
Write-Host "Se debe mover $Diferencia maquina/s virtual/es del nodo $Nodo"
for($i=1; $i -le $Diferencia; $i++)
{
Foreach ($Nodo1 in $Nodos)
{
$PorNodo1=(Get-ClusterNode $Nodo1.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"}).count
if ($PorNodo1 -lt $Promedio)
{
$Maquina=Get-ClusterNode $Nodo.Name -cluster $Cluster | Get-ClusterResource | where {$_.resourcetype.name -eq "Virtual Machine"} | Select-object -first 1
Write Host "Se procede a mover la maquina virtual $Maquina"
Move-ClusterVirtualMachineRole -Name $Maquina.OwnerGroup -Cluster $Cluster -node "$Nodo1"
Break
}
}
}
}
}
Como dije, no soy experto en PowerShell, y estoy seguro de que esto puede hacerse mejor, más fácil y con menos líneas de código. Pero esto funciona y lo hace muy bien.
Las máquinas virtuales se mueven utilizando LiveMigration, así que el uso del script no implica corte de servicios, y solo es válido en cluster de Hyper-V 2008 R2.