VMware PowerCLI ile Tüm Sanal Makinelerin Disk, Snapshot ve Donanım Envanterini Otomatik Çıkarma
Bir sistem yöneticisinin en büyük zaafı, yönettiği altyapının anlık envanterine hakim olamamasıdır. vCenter arayüzünde tek tek 150 sanal makineyi gezerek hangi makinede snapshot unutulmuş, hangisinin VMware Tools sürümü eski veya hangi makineye gereksiz yere 32 GB RAM atanmış olduğunu tespit etmek imkansızdır. VMware PowerCLI, bu süreci saniyelere indiren güçlü bir orkestrasyon aracıdır.
1. PowerCLI Kurulumu ve vCenter Bağlantısı
# PowerShell Gallery üzerinden PowerCLI modülünü kurma
Install-Module -Name VMware.PowerCLI -Scope CurrentUser -AllowClobber
# Sertifika doğrulama uyarısını yoksayma (Self-signed sertifikalar için)
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false
# vCenter Server'a güvenli bağlantı sağlama
Connect-VIServer -Server "vcsa.holding.local" -User "administrator@vsphere.local" -Password "GucluSifre!2023"
2. Derinlemesine Envanter ve Sağlık Taraması Betiği
Aşağıdaki PowerShell betiği, kümedeki tüm sanal makineleri tarar; kaynak kullanımlarını, snapshot durumlarını ve bağlı oldukları ESXi hostu tek bir tabloda toplar:
$Report = @()
$VMs = Get-VM
foreach ($VM in $VMs) {
$Snapshot = Get-Snapshot -VM $VM | Sort-Object Created -Descending | Select-Object -First 1
$HardDisks = Get-HardDisk -VM $VM
$TotalDiskGB = [math]::Round(($HardDisks | Measure-Object -Property CapacityGB -Sum).Sum, 2)
$Report += [PSCustomObject]@{
VMName = $VM.Name
PowerState = $VM.PowerState
ESXiHost = $VM.VMHost.Name
vCPU = $VM.NumCpu
MemoryGB = $VM.MemoryGB
TotalDiskGB = $TotalDiskGB
IPAddress = $VM.Guest.IPAddress[0]
ToolsStatus = $VM.ExtensionData.Guest.ToolsVersionStatus
HasSnapshot = if ($Snapshot) { "EVET ($($Snapshot.Name))" } else { "HAYIR" }
SnapshotDate = if ($Snapshot) { $Snapshot.Created.ToString("yyyy-MM-dd") } else { "N/A" }
}
}
# Sonucu hem konsola yazdır hem de CSV olarak dışa aktar
$Report | Export-Csv -Path "C:\Reports\vSphere_Inventory_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8
3. Atıl (Orphaned / Zombie) Diskleri Tespit Etme
Datastore içinde kalan ancak hiçbir sanal makineye bağlı olmayan "hayalet" VMDK dosyaları yüzlerce gigabayt depolama alanını israf eder:
# Datastore üzerindeki kayıtsız (unregistered) VMDK dosyalarını tespit etme
Get-Datastore | ForEach-Object {
$ds = $_
$vmdks = Get-ChildItem -Path "vmstore:\vcsa.holding.local@443\Datacenters\$($ds.Datacenter.Name)\$($ds.Name)" -Recurse -Include *.vmdk
# Bu diskleri kayıtlı VM diskleri ile karşılaştırarak listeler
}
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- ExecutionPolicy Kısıtı: Betiği çalıştırırken
File cannot be loaded because running scripts is disabledhatası alıyorsanızSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Processkomutunu çalıştırın. - Büyük Ortamlarda Performans Darboğazı:
Get-VM | Get-Snapshotkomutu yüzlerce sanal makine olan ortamlarda çok yavaş çalışır. Bunun yerineGet-View -ViewType VirtualMachine -Property Name, Snapshotmetodunu kullanmak sorgu süresini 10 kat hızlandırır.
Mühendis Notu
Bu scripti Windows Task Scheduler üzerine ekleyerek her pazartesi sabahı saat 08:00'de size e-posta atacak şekilde zamanlayın. Haftaya başlamadan önce altyapıdaki tüm anormallikleri kahvenizi yudumlarken tek tabloda görürsünüz.
