Başlangıç > VMware > 108: PowerCLI ile toplu vMotion

108: PowerCLI ile toplu vMotion

Senaryomuz şöyle; bir cluster’ımız var ancak bu cluster üzerinde bulunan ESX’ler Advanced lisansa sahip. Bunun anlamı DRS kullanılamıyor olması. Peki bu durumda bir fiziksel sunucuya bakım yapmak istediğimizde ne olacak? Sunucuyu maintenance moda almak gerekecek ancak DRS olmadığından üzerinde yer alan tüm VM’leri vMotion ile manuel taşımak gerekecektir. Ya 20+ VM varsa? Hepsini tek tek taşımak…. Pek sevimli değil.

Neyse ki imdadımıza PowerCLI yetişiyor. Aslında bu işlemi tek satırlık bir komut ile de gerçekleştirebiliriz:

  • Get-VMHost -Name ESX01 | Get-VM | Move-VM -Destination (Get-VMHost -Name ESX02) -RunAsync

Bu komut ESX01 üzerinde yer alan tüm VM’leri ESX02 üzerine taşıyacaktır. Ancak burada durmaktansa işi birkaç adım daha ileriye götürebilir ve detaylı bir script ile çok daha fazlasını yapabiliriz. Bu script ile yapmayı hedeflediklerimiz:

  • Script ilgili ESX üzerinde bulunan VM’lerin (en çok karşılaşılan problem olduğundan) CD-DVD sürücülerinin bağlı olup olmadığını kontrol etmeli. Eğer bağlı bir sürücü bulur ise, CD bağlantısını koparmalı.
  • Diğer ESX sunucuların CPU kullanımını belirlemeli.
  • Taşınacak VM’lerin CPU kullanımını belirlemeli.
  • VM’leri en az CPU kullanan ESX’den başlamak suretiyle taşımalı ve her taşımadan sonra ESX sunucularının CPU kullanım listesi güncellemeli.
  • Tüm taşımalardan sonra geri dönüşü kolaylaştırmak adına, hazır kullanılabilir bir powershell scriptini oluşturmalı.

Script uzun olacağından parçalı olarak vermeyi uygun gördüm. Eğer scriptin tamamını istemeniz durumunda benimle iletişime geçebilirsiniz.


#************** Input Parameters ********************
 
$paramESXName = "esx01.domain.name"
$paramClusterName = "ClusterName"
$paramFailbackScript = "VmotionFailback.ps1"

#************* Variables ****************************

$Cluster = Get-Cluster -Name $paramClusterName
$VMHosts = $Cluster | Get-VMHost
$SourceHost = $Cluster | Get-VMHost -Name $paramESXName
$SourceVMs = $SourceHost | Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" }

$CPUDestinationHosts = New-Object System.Collections.ArrayList
$STRDestinationHosts = New-Object System.Collections.ArrayList
$CPUDestinationVMs = New-Object System.Collections.ArrayList
$STRDestinationVMs = New-Object System.Collections.ArrayList

New-Item  -ItemType file $paramFailbackScript | Out-Null

Öncelikle parametreler ve değişkenler. Script içerisinde değiştirmeniz gereken tek yer parametreler. Bakıma alınacak ESX sunucusunun adını, cluster adını ve geri dönüş için kullanılacak scriptin adını belirlemeniz gerekmektedir.


#******************* Main Sub ********************

$StartDate = Get-Date

Write-Host
Write-Host UNMOUNTING CD-DVD DRIVES -ForeGroundColor Yellow
Write-Host

foreach ($VM in $SourceVMs)
 {
  $CDDrive = Get-CDDrive -VM $VM | Where { $_.IsoPath.Length -gt 0 -OR $_.HostDevice.Length -gt 0 }
  If ($CDDrive -eq $null) { Write-Host $VM.Name - CDDrive OK }
   Else
    { Write-Host $VM.Name - CDDrive MOUNTED -> unmounting
     Set-CDDrive -CD $CDDrive -NoMedia -Confirm:$False | Out-Null
    }
 }

VM’lerin mount edilmiş CD-DVD sürücüsü var mı diye kontrol edilir ve eğer tespit edilirse, unmount edilir.


Write-Host
Write-Host ANALYZING DESTINATION VMHOSTS -ForeGroundColor Yellow
Write-Host

foreach ($VMHost in $VMHosts)
 {
  If ($VMHost.Name -eq $SourceHost.Name) { Continue }
  
  Write-Host Working on $VMHost.Name ...
  
  $TotalCPUUsage = 0
  $CPUStats = Get-Stat -Entity $VMHost -Stat cpu.usagemhz.average -Start (Get-Date).AddMinutes(-15) | Where { $_.Instance -eq "" }
  foreach ($CPUStat in $CPUStats) { $TotalCPUUsage += $CPUStat.Value }
  $HostCPUUsage = [math]::Round($TotalCPUUsage / $CPUStats.Count)
  
  $STRDestinationHosts.Add($VMHost.Name) | Out-Null
  $CPUDestinationHosts.Add($HostCPUUsage) | Out-Null
 }

Taşıma yapılabilecek diğer ESX sunucularının CPU kullanımları analiz edilir. Burada son 15 dakikalık periyod baz alınmaktadır.


Write-Host
Write-Host ANALYZING VMs TO BE MIGRATED -ForeGroundColor Yellow
Write-Host

foreach ($VM in $SourceVMs)
 {
  Write-Host Working on $VM.Name ...
  
  $TotalCPUUsage = 0
  $CPUStats = Get-Stat -Entity $VM -Stat cpu.usagemhz.average -Start (Get-Date).AddMinutes(-5) | Where { $_.Instance -eq "" }
  foreach ($CPUStat in $CPUStats) { $TotalCPUUsage += $CPUStat.Value }
  $VMCPUUsage = [math]::Round($TotalCPUUsage / $CPUStats.Count)
 
  $STRDestinationVMs.Add($VM.Name) | Out-Null
  $CPUDestinationVMs.Add($VMCPUUsage) | Out-Null 
 }

Taşıması yapılacak VM sunucuların CPU kullanımları analiz edilir. Burada son 5 dakikalık periyod baz alınmaktadır.


Write-Host
Write-Host ***** RESULTS ***** -ForeGroundColor Yellow
Write-Host
for ($i=0;$i -lt $STRDestinationHosts.Count;$i++) { Write-Host $STRDestinationHosts[$i] - $CPUDestinationHosts[$i] }
Write-Host
for ($i=0;$i -lt $STRDestinationVMs.Count;$i++) { Write-Host $STRDestinationVMs[$i] - $CPUDestinationVMs[$i] }
 
Write-Host
Write-Host TOTAL MIGRATIONS -ForeGroundColor Red
Write-Host

for ($i=0;$i -lt $STRDestinationVMs.Count;$i++)
 {
  $Min = FindMinimum($CPUDestinationHosts)
  Write-Host Moving $STRDestinationVMs[$i] to $STRDestinationHosts[$Min] -NoNewLine
  Write-Host -> Estimated Host CPU Usage after vMotion: $CPUDestinationHosts[$Min] + $CPUDestinationVMs[$i]
  Move-VM -VM (Get-VM -Name $STRDestinationVMs[$i]) -Destination (Get-VMHost -Name $STRDestinationHosts[$Min]) | Out-Null
  Add-Content -Path $paramFailbackScript -Value ("Move-VM -VM " + $STRDestinationVMs[$i] + " -Destination " + $paramESXName) | Out-Null
  
  $STR2Add = $STRDestinationHosts[$Min]
  $CPU2Add = $CPUDestinationHosts[$Min] + $CPUDestinationVMs[$i]
  
  $STRDestinationHosts.Remove($STRDestinationHosts[$Min]) | Out-Null
  $CPUDestinationHosts.Remove($CPUDestinationHosts[$Min]) | Out-Null
  $STRDestinationHosts.Add($STR2Add) | Out-Null
  $CPUDestinationHosts.Add($CPU2Add) | Out-Null
 }

Write-Host

$FinishDate = Get-Date
$ElapsedTime = ($FinishDate - $StartDate)
Write-Host Script RunTime: $ElapsedTime.TotalSeconds seconds -ForeGroundColor Cyan
Write-Host

Taşımalar sıra ile gerçekleştirilir, her taşıma sonrasında ilgili ESX sunucusunun tahmini CPU kullanımı hesaplanır ve liste güncellenir. Bu adımda aynı zamanda, geri dönüş operasyonumuzu kolaylaştıracak powershell scriptine ilgili komutlar kaydedilir ve scriptin toplam çalışma süresi hesaplanır (tamamen bilgi amaçlı).


#************** Functions ****************

function FindMinimum($Values)
 {
  $Min = 0
  $MinValue = $Values[0]
  for ($i=0;$i -lt $Values.Count;$i++)
   {
    If ($Values[$i] -lt $MinValue)
     {
      $MinValue = $Values[$i]
      $Min = $i
     }
   }
  return $Min
 }

Bir array içerisinde en küçük değeri bulmak için kullandığımız fonksiyon.

Parametreleri verip scripti çalıştırdığınızda çıktısı da aşağıdakine benzer olacaktır:

Son olarak da şunu söylemek istiyorum. PowerCLI müthiş değildir de nedir? :)

Kategoriler:VMware Etiketler:,
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

w

Connecting to %s

%d blogcu bunu beğendi: