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:
- vCenter’a güvenli şekilde bağlanma,
- İlgili DRS gruplarındaki VM’leri toplama,
- İ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
Catchbloğ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-DrsClusterGroupile belirtilen DRS grubunu alıyoruz.Memberproperty’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
![[TR] PowerCLI ile Benzer kayıtlar için DRS Gruplarının Karşılaştırılması](https://kadirkozan.com/wp-content/uploads/2026/02/VMware-logo-featured-1.jpg)