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

Platí pro: ✔️ Flexibilní škálovací sady virtuálních počítačů s Linuxem ✔️

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:

Příkazem az disk show můžete získat LastOwnershipUpdateTime pro libovolný disk. 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
unattachedDiskIds=$(az disk list --query '[?managedBy==`null`].[id]' -o tsv)
for id in ${unattachedDiskIds[@]}
do
    if (( $deleteUnattachedDisks == 1 ))
    then

        echo "Deleting unattached Managed Disk with Id: "$id
        az disk delete --ids $id --yes
        echo "Deleted unattached Managed Disk with Id: "$id

    else
        echo $id
    fi
done

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é deleteUnattachedVHD na hodnotu 0. 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ů znovu spusťte skript a nastavte proměnnou deleteUnattachedVHD na hodnotu 1. Tato akce umožňuje odstranit všechna nepřipojená nespravovaná virtuální pevné disky.

# Set deleteUnattachedVHDs=1 if you want to delete unattached VHDs
# Set deleteUnattachedVHDs=0 if you want to see the details of the unattached VHDs
deleteUnattachedVHDs=0
storageAccountIds=$(az storage account list --query [].[id] -o tsv)
for id in ${storageAccountIds[@]}
do
    connectionString=$(az storage account show-connection-string --ids $id --query connectionString -o tsv)
    containers=$(az storage container list --connection-string $connectionString --query [].[name] -o tsv)

    for container in ${containers[@]}
    do 
        
        blobs=$(az storage blob list --show-next-marker -c $container --connection-string $connectionString --query "[?properties.blobType=='PageBlob' && ends_with(name,'.vhd')].[name]" -o tsv)
        
        for blob in ${blobs[@]}
        do
            leaseStatus=$(az storage blob show -n $blob -c $container --connection-string $connectionString --query "properties.lease.status" -o tsv)
            
            if [ "$leaseStatus" == "unlocked" ]
            then 

                if (( $deleteUnattachedVHDs == 1 ))
                then 

                    echo "Deleting VHD: "$blob" in container: "$container" in storage account: "$id

                    az storage blob delete --delete-snapshots include  -n $blob -c $container --connection-string $connectionString

                    echo "Deleted VHD: "$blob" in container: "$container" in storage account: "$id
                else
                    echo "StorageAccountId: "$id" container: "$container" VHD: "$blob
                fi

            fi
        done
    done
done 

Další kroky

Další informace najdete v tématu Odstranění účtu úložiště.