在前面的文章中介紹瞭如何建立Azure Blob Snapshot。那篇文章中建立的指令碼思路是:遍歷所有Storage Account,找到所有vhd檔案,進行Snapshot的建立。
但這種方式不夠嚴謹,有可能是已經刪除了的VM,不需要再進行Snapshot的建立工作。
本文將採用獲取Subscription下所有VM,如果這臺虛擬機器是執行狀態,就去得到其OS Disk和Data Disk,對其進行建立Snapshot的工作。
具體的指令碼如下:
1 $vms = Get-AzureVM 2 foreach ($vm in $vms) 3 { 4 if($vm.Status -eq "ReadyRole") 5 { 6 $osblobname = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-1] 7 $osblobcontainer = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-2] 8 $osblobsa = ($vm.VM.OSVirtualHardDisk).MediaLink.ToString().Split("/")[-3].Split(".")[0] 9 10 $storagekey = (Get-AzureStorageKey -StorageAccountName $osblobsa).Primary 11 $ctr = New-AzureStorageContext -StorageAccountName $osblobsa -StorageAccountKey $storagekey -Environment AzureChinaCloud 12 13 $blob = Get-AzureStorageBlob -Container $osblobcontainer -Context $ctr -Blob $osblobname 14 $blob.ICloudBlob.CreateSnapshot() 15 #write-host $blob.Name 16 17 $count = $vm.VM.DataVirtualHardDisks.Count 18 19 for($i=0;$i -lt $count;$i++) 20 { 21 $datablobname = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-1] 22 $datablobcontainer = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-2] 23 $datablobsa = ($vm.VM.DataVirtualHardDisks)[$i].MediaLink.ToString().Split("/")[-3].Split(".")[0] 24 $storagekey = (Get-AzureStorageKey -StorageAccountName $datablobsa).Primary 25 $ctr = New-AzureStorageContext -StorageAccountName $datablobsa -StorageAccountKey $storagekey -Environment AzureChinaCloud 26 27 $blob = Get-AzureStorageBlob -Container $datablobcontainer -Context $ctr -Blob $datablobname 28 $blob.ICloudBlob.CreateSnapshot() 29 #write-host $blob.name 30 } 31 } 32 }
測試時,可以把
$blob.ICloudBlob.CreateSnapshot()
標註;
把
#write-host $blob.name
撤銷標註。
如果正確,可以列印所有OS Disk和Data Disk的檔名。