[Azure]ARM虚拟机整机磁盘快照[1]——创建快照

来源:互联网 发布:淘宝拍摄灯光布置图解 编辑:程序博客网 时间:2024/05/17 01:44

这一篇分为三个部分,创建整机快照,删除虚拟机快照,从快照还原虚拟机。

第一部分先介绍快照功能,创建快照的思路比较简单,利用 Microsoft.WindowsAzure.Storage 库中的方法来获取 Blob 并为其创建快照。由于是对虚拟机进行整机磁盘快照,所以做的时候先要获取虚拟机的 OS Disk 和 Data Disk 的信息,获取出来后,再针对这些磁盘全部做一遍快照就好了。需要注意的一点是,这种做法,每块磁盘的快照时间会有差异,也就是说并不是同时完成的快照,因此,这一点在我们进行删除快照以及还原快照的时候会稍有影响(后面会说到)。思路上我们先做 OS Disk 的快照,再做 Data Disk 的快照,这样我们后续就可以根据 OS Disk 的快照时间来做参照点了。

不多说,直接看下 Azure Powershell 的脚本代码,代码中做了一些封装,方便使用其他脚本调用:

param(    [Parameter(Mandatory = $true)]     [string]$SubscriptionName,      [Parameter(Mandatory = $true)]    [string]$ResourceGroupName,    [Parameter(Mandatory = $true)]    [string]$VMName)Function CreateSnapshotForDisk($vhdAbsoluteUri){    $StorageAccountName = $vhdAbsoluteUri.Substring(8, $vhdAbsoluteUri.IndexOf(".blob.core.chinacloudapi.cn") - 8);    #length of "https://" is 8    $ContainerPathIndex = $vhdAbsoluteUri.IndexOf("blob.core.chinacloudapi.cn/") + 27;    $ContainerName = $vhdAbsoluteUri.SubString($ContainerPathIndex, $vhdAbsoluteUri.IndexOf('/', $ContainerPathIndex) - $ContainerPathIndex);    $BlobName = $vhdAbsoluteUri.SubString($vhdAbsoluteUri.LastIndexOf('/') + 1);    $storageAccount = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName;    $storageContext = $storageAccount.Context;    $blobClient = $storageContext.Context.StorageAccount.CreateCloudBlobClient();    $blobContainer = $blobClient.GetContainerReference($ContainerName);    $blob = $blobContainer.GetBlockBlobReference($blobName);    $Blob.CreateSnapshot() | Out-Null;}Function CreateSnapshotForVM($rgName, $vmName){    $vm = Get-AzureRmVM -ResourceGroupName $rgName -Name $vmName -WarningAction Ignore;    $osDiskUri = $vm.StorageProfile.OsDisk.Vhd.Uri;    CreateSnapshotForDisk $osDiskUri;    foreach($dataDiskUri in $vm.StorageProfile.DataDisks.Vhd.Uri)    {        CreateSnapshotForDisk $dataDiskUri;    }}#$Cred = New-Object System.Management.Automation.PSCredential("XXXXXXXX@XXXXXXXX.parter.onmschina.cn", (ConvertTo-SecureString "XXXXXXXX" -AsPlainText -Force));#[void](Login-AzureRmAccount -EnvironmentName AzureChinaCloud -Credential $AzureRMCred);[void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName);Write-Host ("Start creating snapshot for VM {0} at {1}" -f $VMName,(Get-Date)) -ForegroundColor Yellow;CreateSnapshotForVM $ResourceGroupName $VMName;Write-Host ("Finished creating snapshot for VM {0} at {1}" -f $VMName,(Get-Date)) -ForegroundColor Green;

脚本中的认证部分可以加也可以不加,具体看用处了。

调用方法就按照参数指定的内容就可以了:

PS> &.\[ARM]create_snapshot_for_VM.ps1 -SubscriptionName <Subscription Name> -ResourceGroupName <Resource Group Name> -VMName <VM Name>

脚本运行结果:


阅读全文
1 0
原创粉丝点击