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