[TR] VMware PowerCLI ile Sanal Makine Hard Disk Bilgilerini Toplanması

[TR] VMware PowerCLI ile Sanal Makine Hard Disk Bilgilerini Toplanması

Bir çalışma arkadaşım içerisinde tam 45 adet VMDK bulunan bir sanal makinenin disk bilgilerini dışa aktarmamızın mümkün olup olmadığını sordu. Özellikle tüm disklerin isimleri ve boyutları gerekiyordu.

Bu tarz ihtiyaçlarda genelde yaptığım gibi önce kısa bir araştırma yaptım. PowerCLI ile bunu gerçekleştirebileceğimi biliyordum ancak işi kolaylaştıracak hazır bir çözüm var mı diye bakmak istedim. Araştırma sırasında başka bir blog yazısında bu senaryo için hazırlanmış oldukça kullanışlı bir fonksiyon buldum.

Ben de bu fonksiyonu kendi scriptime entegre ettim. Script genel olarak üç bölümden oluşuyor:

  1. vCenter bağlantısı,
  2. Disk bilgilerini toplayan fonksiyon,
  3. Çıktının konsola yazdırılması veya CSV olarak export edilmesi,

Aşağıda kullandığım fonksiyonu ve örnek kullanım senaryosunu paylaşıyorum.

Get-VMDisk Fonksiyonu

Bu fonksiyon, parametre olarak aldığı sanal makinelerin tüm disklerini tek tek dolaşarak detaylı bir rapor oluşturur.

Toplanan bilgiler şunlardır:

  • VM adı
  • Power state
  • Diskin bulunduğu datastore
  • VMDK dosya adı
  • Storage format (Thin, Thick vb.)
  • Disk kapasitesi (GB cinsinden)
  • Controller bilgisi
  • Unit numarası
function Get-VMDisk {

[CmdletBinding()]
    param( 
        [Parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0, HelpMessage = "VMs to process")]
        [ValidateNotNullorEmpty()]
          [VMware.VimAutomation.ViCore.Impl.V1.Inventory.InventoryItemImpl[]] $myVMs
    )
Process {
        $View = @()
        foreach ($myVM in $myVMs){
            $VMDKs = $myVM | get-HardDisk
            foreach ($VMDK in $VMDKs) {
                if ($VMDK -ne $null){
                    [int]$CapacityGB = $VMDK.CapacityKB/1024/1024
                    $Report = [PSCustomObject] @{
                            Name = $myVM.name 
                            PowerState = $myVM.PowerState
                            Datastore = $VMDK.FileName.Split(']')[0].TrimStart('[')
                            VMDK = $VMDK.FileName.Split(']')[1].TrimStart('[')
                            StorageFormat = $VMDK.StorageFormat
                            CapacityGB = $CapacityGB
                            Controller = $VMDK.ExtensionData.ControllerKey -1000
                            Unit = $VMDK.ExtensionData.UnitNumber
                        }
                        $View += $Report
                    }   
                }
            }
    $View | Sort-Object VMname, Controller, Unit
    }
}

#Make Connection with vCenter
Try {
    if ($Connect) {
      Continue
    }
    else {
      $Credential = Get-Credential -UserName "Username" -Message "Provide password."
      $Connect = Connect-VIServer "vcenter" -Credential $Credential
      Write-Host Connected to $Connect -ForegroundColor Green
    }
  }
  Catch {
    $Error
    Write-Host Unable to connect to $Connect -ForegroundColor Red
  }
#Output to Console
Get-VM "name"| Get-VMDisk | ft -AutoSize

#Export to CSV
Get-VM "name"| Get-VMDisk | Export-Csv -NoTypeInformation -UseCulture -Path "VM-Disks.csv"

#Disconnect vCenter Connection
Disconnect-VIServer *




Fonksiyonun Çalışma Mantığı

  • Get-HardDisk ile ilgili VM üzerindeki tüm diskler çekiliyor.
  • Disk kapasitesi KB cinsinden geldiği için GB’a dönüştürülüyor.
  • Datastore ve VMDK adı, dosya yolundan ayrıştırılıyor.
  • Her disk için bir PSCustomObject oluşturularak rapor listesine ekleniyor.
  • Son olarak controller ve unit sırasına göre sıralanmış bir çıktı üretiliyor.

Bu sayede çok diskli makinelerde bile düzenli ve okunabilir bir çıktı elde ediliyor.

vCenter Bağlantısı

Script içerisinde öncelikle vCenter bağlantısı kontrol ediliyor. Eğer mevcut bir bağlantı yoksa kullanıcıdan credential alarak bağlantı kuruluyor.

Try {
    if ($Connect) {
      Continue
    }
    else {
      $Credential = Get-Credential -UserName "Username" -Message "Provide password."
      $Connect = Connect-VIServer "vcenter" -Credential $Credential
      Write-Host Connected to $Connect -ForegroundColor Green
    }
  }
  Catch {
    $Error
    Write-Host Unable to connect to $Connect -ForegroundColor Red
  }


Bu yapı sayesinde script tekrar tekrar çalıştırıldığında gereksiz bağlantı denemeleri yapılmamış oluyor.

Çıktıyı Konsolda Görüntüleme

Belirli bir VM’in disk bilgilerini konsolda tablo formatında görmek için;

Get-VM "name" | Get-VMDisk | ft -AutoSize




Bu komut çıktıyı formatlanmış ve okunabilir şekilde gösterir.

CSV Olarak Dışa Aktarma

Disk bilgilerini bir dosyaya aktarmak isterseniz;

Get-VM "name" | Get-VMDisk | Export-Csv -NoTypeInformation -UseCulture -Path "VM-Disks.csv"




Bu sayede Excel’de açılabilir bir rapor elde edebilirsiniz. Özellikle çok diskli veya çok sayıda VM içeren ortamlarda raporlama için oldukça kullanışlıdır.

vCenter Bağlantısını Kapatma

İşlem bittikten sonra bağlantıyı kapatmayı unutmamak iyi bir pratiktir;

Disconnect-VIServer *




Özellikle çok sayıda VMDK içeren sanal makinelerde manuel kontrol yapmak hem zaman kaybettirir hem de hata riskini artırır. PowerCLI ile bu süreci otomatik hale getirerek:

  • Tüm diskleri hızlıca listeleyebilir
  • Kapasite ve datastore bilgilerini net şekilde görebilir
  • Raporlama için CSV çıktısı alabilirsiniz

Kısacası, birkaç satırlık bir script ile ciddi bir operasyonel kolaylık sağlanmış oluyor.