在前面的文章中介绍了如何创建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的文件名。