VMware vSphere ortamlarında sistem yöneticilerinin karşılaştığı en önemli görevlerden biri bakım veya güncelleme öncesi sanal makinelerin (VM) güvenliğini sağlamaktır. Bu tür durumlarda snapshot (anlık görüntü) almak olası hatalardan hızla geri dönebilmek adına kritik önem taşır.
PowerCLI, VMware ortamlarını PowerShell üzerinden otomatikle yönetmeye olanak sağlayan güçlü bir araçtır. Bu makalemde PowerCLI kullanarak birden fazla sanal makine için toplu snapshot alma ve silme işlemlerinin nasıl yapılacağını adım adım ve ayrıntılı olarak inceleyeceğiz.
Neden Snapshot Almalıyız?
Snapshot’lar bir VM’in disk durumu, yapılandırmaları ve (isteğe bağlı olarak) RAM içeriğini içeren tam bir kopyasını oluşturur. Şu senaryolarda snapshot almak özellikle önemlidir:
- İşletim sistemi veya uygulama güncellemeleri öncesi
- Kritik yapılandırma değişiklikleri yapılmadan önce
- Yazılım test süreçlerinde
- Güvenlik yaması uygulanmadan önce
Snapshot’lar kurtarma planlarının bir parçası olsa da yedekleme yerine geçmezler. Bu nedenle uzun süreli koruma yerine kısa süreli geri dönüş amacıyla kullanılmalıdırlar.
Gereksinimler
İşleme başlamadan önce aşağıdaki gereksinimlerin sağlandığından emin olun:
- PowerShell 5.1 veya üzeri
- VMware PowerCLI modülü (sürüm 12.x veya üzeri önerilir)
Install-Module -Name VMware.PowerCLI
- vCenter Server erişimi ve uygun yetkilere sahip bir kullanıcı hesabı
- Snapshot alınacak VM’lerin listesini içeren düz metin dosyası (örn:
C:\snap-list.txt
)
1. vCenter Sunucusuna Bağlantı Kurmak
PowerCLI ile komut çalıştırabilmek için vCenter sunucusuna bağlanmak gerekir:
Connect-VIServer -Server "vcenter.domain.local" -Credential (Get-Credential)
Komut çalıştırıldığında bir kimlik penceresi açılır ve vCenter’a bağlanmak için kullanıcı adı ve şifre girmeniz istenir.
Not: Sık kullanıyorsanız kimlik doğrulamasını otomatikleştirmek için New-VICredentialStoreItem ile şifreli oturum bilgisi oluşturabilirsiniz.
2. Snapshot Alınacak VM Listesinin Hazırlanması
C:\snap-list.txt
gibi bir dosya içerisine snapshot alınmasını istediğiniz VM’lerin isimlerini alt alta yazınız.
WebServer01
AppServer02
DB01
TestVM03
Bu dosya PowerCLI komutlarıyla işlenecek olan temel listedir.
3. PowerCLI ile Snapshot Alma Betiği
Aşağıdaki scirpt ile belirtilen listedeki VM’ler için snapshot alır.
$hostnameFile = "C:\snap-list.txt"
$snapshotName = "Security Patch Snapshot - $(Get-Date -Format yyyyMMdd-HHmm)"
$snapshotDescription = "Otomatik alınan snapshot - PowerCLI betiğiyle"
$hostnames = Get-Content -Path $hostnameFile
foreach ($hostname in $hostnames) {
$vm = Get-VM -Name $hostname -ErrorAction SilentlyContinue
if ($vm -ne $null) {
Write-Host "[$hostname] Snapshot alınıyor..."
try {
New-Snapshot -VM $vm -Name $snapshotName -Description $snapshotDescription -Memory:$false -Quiesce:$true
Write-Host "[$hostname] Snapshot başarıyla alındı."
} catch {
Write-Warning "[$hostname] Snapshot alma başarısız: $_"
}
} else {
Write-Warning "[$hostname] VM bulunamadı."
}
}
-Memory:$false
: Snapshot’a RAM durumu dahil edilmez. Daha az disk alanı tüketir.
-Quiesce:$true
: VM içindeki disk işlemleri askıya alınarak daha tutarlı bir görüntü alınır (Destekleyen OS ve araçlar varsa).
Tarihli snapshot adı: Her çalıştırmada benzersiz snapshot ismi oluşur.
Hata yönetimi: try/catch
yapısı ile sorun yaşanan VM’lerde scirpt durmaz diğerlerine devam eder.
4. Snapshot Silme Betiği (Tüm Snapshot’ları)
Snapshot’ların uzun süre sistemde tutulması performans düşüklüğüne ve disk doluluğuna yol açabilir. Aşağıdaki scirpt ile listedeki tüm VM’lerdeki snapshot’ları siler.
$hostnameFile = "C:\snap-list.txt"
$hostnames = Get-Content -Path $hostnameFile
foreach ($hostname in $hostnames) {
$vm = Get-VM -Name $hostname -ErrorAction SilentlyContinue
if ($vm -ne $null) {
$snapshots = Get-Snapshot -VM $vm -ErrorAction SilentlyContinue
if ($snapshots.Count -gt 0) {
Write-Host "[$hostname] Snapshot'lar siliniyor..."
foreach ($snapshot in $snapshots) {
try {
Remove-Snapshot -Snapshot $snapshot -Confirm:$false
Write-Host "[$hostname] '$($snapshot.Name)' snapshot'ı silindi."
} catch {
Write-Warning "[$hostname] Snapshot silme hatası: $_"
}
}
} else {
Write-Host "[$hostname] Silinecek snapshot bulunamadı."
}
} else {
Write-Warning "[$hostname] VM bulunamadı."
}
}
Tag’e Göre Snapshot Almak
$vms = Get-VM | Where-Object { $_ | Get-TagAssignment | Where-Object { $_.Tag.Name -eq "Snapshot-Required" } }
foreach ($vm in $vms) {
New-Snapshot -VM $vm -Name "TagSnapshot-$(Get-Date -Format yyyyMMdd)" -Description "Tagged snapshot"
}