[Azure]ARM虚拟机整机磁盘快照[3]——清空虚拟机快照

来源:互联网 发布:大连爱知时计 编辑:程序博客网 时间:2024/06/07 19:28

继续上一小节,清空快照比删除某组虚拟机磁盘快照要更容易一些,不需要进行区分或者分区,我们遍历所有虚拟机的磁盘,列出全部快照删除即可,脚本如下:

param(    [Parameter(Mandatory = $true)]     [string]$SubscriptionName,      [Parameter(Mandatory = $true)]    [string]$ResourceGroupName,    [Parameter(Mandatory = $true)]    [string]$VMName)Function PrepareBlobContext($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);    return $blob;}Function DeleteAllSnapshots($rgName, $vmName){    $vm = Get-AzureRmVM -ResourceGroupName $rgName -Name $vmName -WarningAction Ignore;    $hasSnapshot = $false;        $osDiskUri = $vm.StorageProfile.OsDisk.Vhd.Uri;    $blob = PrepareBlobContext $osDiskUri;    $osDiskSnapshotList = @(GetSnapshotListByBlob $blob);    $osDiskSnapshotPropertiesList = @(GetSnapshotPropertiesList $osDiskSnapshotList $blob);    $dataDiskSnapshotLists = @();    $dataDiskSnapshotPropertiesLists = @();    foreach($dataDiskUri in $vm.StorageProfile.DataDisks.Vhd.Uri)    {        $blob = PrepareBlobContext $dataDiskUri;        $dataDiskSnapshotList = @(GetSnapshotListByBlob $blob);        if ($dataDiskSnapshotList.Count -gt 0)        {            $hasSnapshot = $true;        }        $dataDiskSnapshotPropertiesList = @(GetSnapshotPropertiesList $dataDiskSnapshotList $blob);        $dataDiskSnapshotLists += $null;        $dataDiskSnapshotLists[$dataDiskSnapshotLists.Count - 1] = $dataDiskSnapshotList;        $dataDiskSnapshotPropertiesLists += $null;        $dataDiskSnapshotPropertiesLists[$dataDiskSnapshotPropertiesLists.Count - 1] = $dataDiskSnapshotPropertiesList;    }        if ($osDiskSnapshotList.Count -eq 0 -and !$hasSnapshot)    {        Write-Host "Virtual Machine has no snapshots." -ForegroundColor Yellow;        return;    }    Write-Host "The following snapshots will be deleted:" -ForegroundColor Yellow;    foreach ($osDiskSnapshotProperties in $osDiskSnapshotPropertiesList)    {        Write-Host ("{0}({1})" -f $osDiskSnapshotProperties.SnapshotUri, $osDiskSnapshotProperties.SnapshotTime) -ForegroundColor Red;    }    foreach ($dataDiskSnapshotPropertiesList in $dataDiskSnapshotPropertiesLists)    {        foreach ($dataDiskSnapshotProperties in $dataDiskSnapshotPropertiesList)        {            Write-Host ("{0}({1})" -f $dataDiskSnapshotProperties.SnapshotUri, $dataDiskSnapshotProperties.SnapshotTime) -ForegroundColor Red;        }    }    If ($PSCmdlet.ShouldContinue("Confirm?", "=== Confirm delete Opeartion ==="))    {        foreach ($osDiskSnapshot in $osDiskSnapshotList)        {            $osDiskSnapshot.Delete();        }        foreach ($dataDiskSnapshotList in $dataDiskSnapshotLists)        {            foreach ($dataDiskSnapshot in $dataDiskSnapshotList)            {                $dataDiskSnapshot.Delete();            }        }        Write-Host "Done";    } else {        Write-Host "Canceled";    }}Function GetSnapshotListByBlob($blob){    return $blob.Container.ListBlobs($blob.Name, $true, "Snapshots") | Where {$_.SnapshotTime -ne $null};}Function GetSnapshotPropertiesList($Snapshots, $blob){    $Index = 0    $SnapshotPropertiesList = @()    Foreach($Snapshot in $Snapshots)    {        $Index++        $SnapshotPropertiesList += [PSCustomObject]@{ID = $Index                                                     BlobName = $blob.Name                                                     SnapshotTime = $Snapshot.SnapshotTime                                                     SnapshotUri = $Snapshot.Uri}    }    return $SnapshotPropertiesList;}#$Cred = New-Object System.Management.Automation.PSCredential("XXXXXXXX@XXXXXXXX.partner.onmschina.cn", (ConvertTo-SecureString "XXXXXXXX" -AsPlainText -Force));#[void](Login-AzureRmAccount -EnvironmentName AzureChinaCloud -Credential $Cred);[void](Select-AzureRmSubscription -SubscriptionName $SubscriptionName);DeleteAllSnapshots $ResourceGroupName $VMName;

调用方法:

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

脚本执行结果: