Başlangıç > VMware > 225: Snapshot’dan VM üretmek

225: Snapshot’dan VM üretmek

Gerek vSphere Client olsun gerekse Web Client, VMware bazı özellikleri GUI üzerine koymamayı tercih ediyor, fakat API üzerinden bu özellikler kullanılabiliyor. Bunlardan bir tanesi de, snapshot’ını aldığımız bir sanal sunucudan, geçmişe yönelik klon üretmek.

Not: 6.5 ile birlikte de GUI üzerinde göremedim ancak bir yerlerde gizlenmiş olma ihtimalini açık bırakıyorum.

GUI üzerinden snapshot modunda olan bir sanal sunucunun klonunu almak istersek, sistemin yapacağı, arada geçen tüm snapshot’ları, yeni oluşturulacak VM ile birlikte konsolide etmek olacaktır. Bu durumda arada yer alan bir durumun klonunu oluşturamayacağız. Örnek olarak aşağıdaki sunucuyu düşünebiliriz.

snapclone

Yaptığım testte kolaylık olması açısından, sunucunun sadece vHW (sanal donanım seviyesi) değerini birer artırarak snapshot aldım. Bu arada, vHW seviyesini birer birer, istediğiniz seviyede artırmak da GUI üzerinden yapabileceğimiz bir aksiyon değil. ESXi sunucusu hangi seviyede ise, direk bizi o seviyeye çıkarır. Kontrollü gidebilmek için PowerCLI üzerinde aşağıdaki komutu kullandım.


$VM = Get-VM -Name PHOTON02
$VM.ExtensionData.UpgradeVM("vmx-10")
$VM.ExtensionData.UpgradeVM("vmx-11")

Gelelim işin klon kısmına. Bu işi gerçekleştiren, vSphere 6.0 API referans dokümanından da ulaşabileceğimiz, CloneVM_Task metodudur. Bu metod üç adet parametre kabul eder;

  • Folder: ManagedObjectReference tipinde
  • Name: Oluşacak klonun adı, string tipinde
  • Spec: VirtualMachineCloneSpec tipinde. Klonlama operasyonu ile ilgili tüm parametreleri girdiğimiz obje budur.

Spec objesi çok detaylı bir objedir. İçeriğini ve alt kırılımlarını incelediğimizde karşımıza diskMoveType isimli bir özellik çıkar ki bütün farkı yaratan bu özelliktir. Alabileceği beş adet değer bulunur:

  • createNewChildDiskBacking: Eğer linked klon üretmek istiyorsak, kullanabileceğimiz değer budur. Bu yöntem en hızlı klon alma yöntemidir ve bir anda onlarca klonu alıp, sunucuları hayata geçirebilirsiniz. Script içerisinde LinkedClone opsiyonu ile bu değeri kullandım.
  • moveAllDiskBackingsAndAllowSharing: Tüm delta dosyaların da kopyalanması ile birlikte full klon oluşturmayı tetikler ancak snapshot konfigürasyon dosyasını barındırmaz. Dolayısı ile klon alınmış sunucu, snapshot bilgilerini göremez.
  • moveAllDiskBackingsAndConsolidate: Tüm disklerin taşınıp, konsolide edildiği durum.
  • moveAllDiskBackingsAndDisallowSharing: vSphere Client üzerinden klon gerçekleştirdiğimizde kullanılan değer budur. Tüm delta disklerin konsolide edilmesini sağlar. Klon metodu içerisinde kullanıldığında, yukarıdaki opsiyon ile aynı görevi görür. Script içerisinde, LinkedClone talep edilmediği durumda bu değeri kullandım.
  • moveChildMostDiskBacking: Yine linked klon yapmamızı ancak tüm disklerin değil, en son deltanın kopyalanmasını tetikler.

Şimdi gelelim hem full klon hem de linked klon oluşturabileceğimiz fonksiyonumuza;


function CreateVMFromSnap {
[CmdletBinding()]
Param ( [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$SourceVMName,
[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$CloneName,
[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$SnapshotName,
[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$ClusterName,
[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$DatastoreName,
[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String]$FolderName,
[parameter(Mandatory=$false)][Switch]$LinkedClone
)

$SourceVM = Get-VM -Name $SourceVMName -ErrorAction:SilentlyContinue
if ($SourceVM) {
$Snapshots = Get-Snapshot -VM $SourceVM
$ResourcePoolMoRef = (Get-Cluster -Name $ClusterName | Get-ResourcePool -Name "Resources").ExtensionData.MoRef
$DatastoreMoRef = (Get-Datastore -Name $DatastoreName).ExtensionData.MoRef
$FolderMoRef = (Get-Folder -Name $FolderName -Type VM).ExtensionData.MoRef
if ($LinkedClone) { $CloneType = "createNewChildDiskBacking" }
else { $CloneType = "moveAllDiskBackingsAndDisallowSharing" }

$CloneSpec = New-Object Vmware.Vim.VirtualMachineCloneSpec
$CloneSpec.Snapshot = ($Snapshots | Where-Object {$_.Name -eq $SnapshotName}).ExtensionData.Snapshot
$CloneSpec.Location = New-Object Vmware.Vim.VirtualMachineRelocateSpec
$CloneSpec.Location.Pool = $ResourcePoolMoRef
$CloneSpec.Location.Datastore = $DatastoreMoRef
$CloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::$CloneType
$VITask = $SourceVM.ExtensionData.CloneVM_Task($FolderMoRef, $CloneName, $CloneSpec)

} else {
Write-Host ("{0} sanal sunucusu bulunamadi" -f $SourceVMName) -ForeGroundColor Red
}
}

Aşağıda LinkedClone oluşturabileceğimiz örnek bir komutu görebiliriz. Seçtiğimiz snapshot bellek bilgilerini de barındırıyor ise, arka planda her VM için bellek verisinin kopyalanması gerekecektir, bu da biraz daha zaman alacaktır. Diğer türlü, çok daha hızlı şekilde sunucuları açabiliriz (tabi açarken IP çakışması olabileceğini de atlamamamız gerekiyor).


for ($num=3; $num -le 10; $num++) {
CreateVMFromSnap -SourceVMName PHOTON02 -CloneName ("PHOTON{0}" -f $num) -SnapshotName VMX10_Acik_Belleksiz -ClusterName DC2.DemoCluster -DatastoreName Datastore02 -FolderName VMFolder -LinkedClone
#Start-VM -VM ("PHOTON{0}" -f $num)
}

Sonuç:

snapclone2

Kategoriler:VMware Etiketler:
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: