Sistem/DevOps•6 dk okuma

VMware PowerCLI ile Tüm Sanal Makinelerin Disk, Snapshot ve Donanım Envanterini Otomatik Çıkarma

Yüzlerce sanal makinenin IP adresleri, vCPU/RAM tahsisleri, atıl (zombie) diskleri ve unutulmuş snapshotlarını PowerShell PowerCLI ile tarayıp Excel/HTML formatında e-posta atan otomasyon.

AE

Ahmet Ertekin

11 May 2023

VMware PowerCLI ile Tüm Sanal Makinelerin Disk, Snapshot ve Donanım Envanterini Otomatik Çıkarma

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 disabled hatası alıyorsanız Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process komutunu çalıştırın.
  • Büyük Ortamlarda Performans Darboğazı: Get-VM | Get-Snapshot komutu yüzlerce sanal makine olan ortamlarda çok yavaş çalışır. Bunun yerine Get-View -ViewType VirtualMachine -Property Name, Snapshot metodunu 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.