[TR] PowerCLI ile Benzer kayıtlar için DRS Gruplarının Karşılaştırılması

[TR] PowerCLI ile Benzer kayıtlar için DRS Gruplarının Karşılaştırılması

VMware vSphere ortamlarında DRS (Distributed Resource Scheduler) VM grupları özellikle affinity/anti-affinity kuralları kullanıldığında altyapı tasarımının kritik bir parçası haline gelir.

Bu gruplar sayesinde belirli sanal makineleri belirli host’larda çalışacak şekilde konumlandırabilir ya da birbirlerinden ayrı tutabilirsiniz.

Ancak büyük ve dinamik ortamlarda zaman zaman istenmeyen bir durum ortaya çıkabilir. Aynı sanal makinenin birden fazla DRS VM grubuna eklenmiş olması.

Bu durum özellikle çakışan kurallar varsa beklenmeyen DRS davranışlarına ve karmaşık troubleshooting süreçlerine neden olabilir.

Manuel kontrol elbette mümkündür fakat cluster büyüdükçe bu yöntem hem zaman kaybettirir hem de hata riskini artırır.

Bu ihtiyacı karşılamak için iki DRS VM grubunu karşılaştıran ve her iki grupta da bulunan sanal makineleri listeleyen basit ama etkili bir PowerCLI script’i hazırladım.

Bu script üç temel aşamadan oluşuyor:

  1. vCenter’a güvenli şekilde bağlanma,
  2. İlgili DRS gruplarındaki VM’leri toplama,
  3. İki listeyi karşılaştırarak ortak VM’leri tespit etme,

VMware vCenter Bağlantısı

Script’in ilk bölümü vCenter bağlantısını kontrol eder. Eğer mevcut bir bağlantı yoksa kullanıcıdan kimlik bilgileri ve vCenter adı istenir. Böylece script farklı ortamlarda tekrar kullanılabilir ve güvenli şekilde çalıştırılabilir.

# Connect to vCenter
Try {
  if ($Connect) {
    Continue
  }
  else {
    $Credential = Get-Credential -Message "Provide username and password."
    $vcenter = Read-Host "Enter vCenter Name..."
    $connect = Connect-VIServer $vcenter -Credential $Credential
    Write-Host Connected to $connect -ForegroundColor Green
  }
}
Catch {
  $Error
}

Bu yapı sayesinde:

  • Script çalıştırıldığında aktif bir bağlantı varsa yeniden bağlanmaya çalışmaz.
  • Kimlik bilgileri açık şekilde kod içine yazılmaz.
  • Hata oluşursa Catch bloğu devreye girer.

Bu küçük dokunuş script’i “tek kullanımlık” olmaktan çıkarıp daha profesyonel bir hale getirir.

DRS VM Gruplarındaki Sanal Makineleri Toplama

Bağlantı sağlandıktan sonra sıra karşılaştırılacak gruplardaki VM’leri toplamaya gelir.

# Get VM's currently in DRS VM Groups
$D1VMs = (Get-DrsClusterGroup -Name "VM-D1" | Select-Object Member -ExpandProperty Member)
$D2VMs = (Get-DrsClusterGroup -Name "VM-D2" | Select-Object Member -ExpandProperty Member)

Burada yapılan işlem oldukça nettir:

  • Get-DrsClusterGroup ile belirtilen DRS grubunu alıyoruz.
  • Member property’sini genişleterek grubun içindeki sanal makineleri elde ediyoruz.
  • Her grup için ayrı bir değişkende VM listesi tutuyoruz.

Bu noktada elimizde iki ayrı VM koleksiyonu bulunuyor:
$D1VMs ve $D2VMs.

İki Grubu Karşılaştırma

Şimdi asıl önemli kısma geliyoruz: İki listeyi karşılaştırmak.

$Compare = Compare-Object -ReferenceObject $D1VMs -DifferenceObject $D2VMs -Property Name -IncludeEqual
$Compare
Burada PowerShell’in güçlü komutlarından biri olan Compare-Object devreye giriyor.

Parametrelerin anlamı:

  • -ReferenceObject → İlk liste
  • -DifferenceObject → İkinci liste
  • -Property Name → Karşılaştırma VM isimlerine göre yapılır
  • -IncludeEqual → Ortak olanları da listele

Çıktıdaki SideIndicator kolonu sonucu anlamamızı sağlar:

  • <= → Sadece ilk grupta var
  • => → Sadece ikinci grupta var
  • == → Her iki grupta da var

Bizim için en kritik değer == olan satırlardır.

Bunlar iki DRS grubunda birden bulunan VM’leri gösterir.

Sonuçları Dışa Aktarma

Elde edilen çıktıyı sadece ekranda görmek yerine bir dosyaya aktarmak çoğu zaman daha faydalıdır.

Örneğin CSV formatında;

$Compare | Export-Csv -Path "C:\Temp\DRS-Compare.csv" -NoTypeInformation




veya basit bir text dosyası olarak;

$Compare | Out-File "C:\Temp\DRS-Compare.txt"




Bu yöntem özellikle raporlama ve dokümantasyon açısından avantaj sağlar.

Gerekirse Aksiyon Alma

Tespit ettiğiniz VM’lerden birini belirli bir DRS grubundan çıkarmak isterseniz aşağıdaki gibi bir komut kullanabilirsiniz.

Get-DrsClusterGroup -Name "VM-D1" | Set-DrsClusterGroup -VM "PD-TEST04" -Remove




Burada VM adı manuel yazılmıştır. Ancak daha gelişmiş bir senaryoda, Compare-Object çıktısından gelen == değerlerini filtreleyerek işlemi otomatik hale getirebilirsiniz. Böylece çift kayıtlı VM’leri doğrudan temizlemek mümkün olur.

#Connect to vCenter
Try {
  if ($Connect) {
    Continue
  }
  else {
    $Credential = Get-Credential -Message "Provide username and password."
    $vcenter = Read-Host "Enter vCenter Name..."
    $connect = Connect-VIServer $vcenter -Credential $Credential
    Write-Host Connected to $connect -ForegroundColor Green
  }
}
Catch {
  $Error
} 

#Get VM's currently in DRS VM Groups
$D1VMs = (Get-DrsClusterGroup -Name "VM-D1" | Select-Object Member -ExpandProperty Member)
$D2VMs = (Get-DrsClusterGroup -Name "VM-D2" | Select-Object Member -ExpandProperty Member)

$Compare = Compare-Object -ReferenceObject $D1VMs -DifferenceObject $D2VMs -Property Name -IncludeEqual
$Compare

Disconnect-VIServer