Vyhledání a odstranění nepřipojených spravovaných a nespravovaných disků Azure pomocí Azure PowerShellu

Platí pro: ✔️ Virtuální počítače s Windows s Linuxem ✔️ ✔️ – Flexibilní škálovací sady Uniform Scale Sets ✔️

Když odstraníte virtuální počítač v Azure, ve výchozím nastavení se neodstraní všechny disky připojené k virtuálnímu počítači. Tato funkce pomáhá předcházet ztrátě dat v důsledku neúmyslného odstranění virtuálních počítačů. Po odstranění virtuálního počítače budete dál platit za nepřipojené disky. V tomto článku se dozvíte, jak najít a odstranit všechny nepřipojené disky a snížit zbytečné náklady.

Poznámka:

K získání LastOwnershipUpdateTime jakéhokoli disku můžete použít příkaz Get-AzureDisk. Tato vlastnost představuje, kdy byl stav disku naposledy aktualizován. U nepřipojeného disku se zobrazí čas, kdy byl disk nepřipojený. Tato vlastnost je prázdná pro nově vytvořené disky, dokud se nezmění jejich stav.

Spravované disky: Vyhledání a odstranění nepřipojených disků

Následující skript vyhledá nepřipojené spravované disky prozkoumáním hodnoty vlastnosti ManagedBy . Pokud je spravovaný disk připojený k virtuálnímu počítači, vlastnost ManagedBy obsahuje ID prostředku virtuálního počítače. Pokud není spravovaný disk nepřipojený, má vlastnost ManagedBy hodnotu null. Skript prozkoumá všechny spravované disky v předplatném Azure. Když skript vyhledá spravovaný disk s vlastností ManagedBy nastavenou na hodnotu null, skript určí, že disk není nepřipojený.

Důležité

Nejprve spusťte skript nastavením proměnné deleteUnattachedDisks na hodnotu 0. Tato akce umožňuje najít a zobrazit všechny nepřipojené spravované disky.

Po kontrole všech nepřipojených disků znovu spusťte skript a nastavte proměnnou deleteUnattachedDisks na hodnotu 1. Tato akce umožňuje odstranit všechny nepřipojené spravované disky.

# Set deleteUnattachedDisks=1 if you want to delete unattached Managed Disks
# Set deleteUnattachedDisks=0 if you want to see the Id of the unattached Managed Disks
$deleteUnattachedDisks=0
$managedDisks = Get-AzDisk
foreach ($md in $managedDisks) {
    # ManagedBy property stores the Id of the VM to which Managed Disk is attached to
    # If ManagedBy property is $null then it means that the Managed Disk is not attached to a VM
    if($md.ManagedBy -eq $null){
        if($deleteUnattachedDisks -eq 1){
            Write-Host "Deleting unattached Managed Disk with Id: $($md.Id)"
            $md | Remove-AzDisk -Force
            Write-Host "Deleted unattached Managed Disk with Id: $($md.Id) "
        }else{
            $md.Id
        }
    }
 }

Nespravované disky: Vyhledání a odstranění nepřipojených disků

Nespravované disky jsou soubory VHD uložené jako objekty blob stránky v účtech úložiště Azure. Následující skript hledá nepřipojené nespravované disky (objekty blob stránky) prozkoumáním hodnoty LeaseStatus vlastnost. Pokud je nespravovaný disk připojený k virtuálnímu počítači, vlastnost LeaseStatus je nastavena na Uzamčeno. Pokud není nespravovaný disk nepřipojený, vlastnost LeaseStatus je nastavena na Unlocked. Skript prozkoumá všechny nespravované disky ve všech účtech úložiště Azure v předplatném Azure. Když skript vyhledá nespravovaný disk s vlastností LeaseStatus nastavenou na Unlocked, skript určí, že disk není nepřipojený.

Důležité

Nejprve spusťte skript nastavením proměnné deleteUnattachedVHDs na $falsehodnotu . Tato akce umožňuje najít a zobrazit všechny nepřipojené nespravované virtuální pevné disky.

Po kontrole všech nepřipojených disků spusťte skript znovu a nastavte proměnnou deleteUnattachedVHDs na $true. Tato akce umožňuje odstranit všechna nepřipojená nespravovaná virtuální pevné disky.

# Set deleteUnattachedVHDs=$true if you want to delete unattached VHDs
# Set deleteUnattachedVHDs=$false if you want to see the Uri of the unattached VHDs
$deleteUnattachedVHDs=$false
$storageAccounts = Get-AzStorageAccount
foreach($storageAccount in $storageAccounts){
    $storageKey = (Get-AzStorageAccountKey -ResourceGroupName $storageAccount.ResourceGroupName -Name $storageAccount.StorageAccountName)[0].Value
    $context = New-AzStorageContext -StorageAccountName $storageAccount.StorageAccountName -StorageAccountKey $storageKey
    $containers = Get-AzStorageContainer -Context $context
    foreach($container in $containers){
        $blobs = Get-AzStorageBlob -Container $container.Name -Context $context
        #Fetch all the Page blobs with extension .vhd as only Page blobs can be attached as disk to Azure VMs
        $blobs | Where-Object {$_.BlobType -eq 'PageBlob' -and $_.Name.EndsWith('.vhd')} | ForEach-Object { 
            #If a Page blob is not attached as disk then LeaseStatus will be unlocked
            if($_.ICloudBlob.Properties.LeaseStatus -eq 'Unlocked'){
                    if($deleteUnattachedVHDs){
                        Write-Host "Deleting unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
                        $_ | Remove-AzStorageBlob -Force
                        Write-Host "Deleted unattached VHD with Uri: $($_.ICloudBlob.Uri.AbsoluteUri)"
                    }
                    else{
                        $_.ICloudBlob.Uri.AbsoluteUri
                    }
            }
        }
    }
}

Další kroky

Další informace najdete v tématu Odstranění účtu úložiště a identifikace osamocených disků pomocí PowerShellu.