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

60 篇文章 0 订阅
59 篇文章 0 订阅

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

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>

脚本执行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值