Znajdowanie i usuwanie niedołączonego dysku zarządzanego i niezarządzanego platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux — elastyczne zestawy skalowania ✔️

Po usunięciu maszyny wirtualnej na platformie Azure domyślnie wszystkie dyski dołączone do maszyny wirtualnej nie zostaną usunięte. Ta funkcja pomaga zapobiegać utracie danych z powodu przypadkowego usunięcia maszyn wirtualnych. Po usunięciu maszyny wirtualnej będziesz nadal płacić za nieprzyłączone dyski. W tym artykule pokazano, jak znaleźć i usunąć wszelkie nieprzyłączone dyski i zmniejszyć niepotrzebne koszty.

Uwaga

Możesz użyć polecenia az disk show , aby pobrać element LastOwnershipUpdateTime dla dowolnego dysku. Ta właściwość reprezentuje czas ostatniej aktualizacji stanu dysku. W przypadku nieprzyłączonego dysku pokazuje to czas, kiedy dysk nie został dołączony. Ta właściwość jest pusta dla nowo utworzonych dysków, dopóki ich stan nie ulegnie zmianie.

Dyski zarządzane: znajdowanie i usuwanie niedołączanych dysków

Poniższy skrypt wyszukuje niedołączone dyski zarządzane, sprawdzając wartość właściwości ManagedBy. Gdy dysk zarządzany jest dołączony do maszyny wirtualnej, właściwość ManagedBy zawiera identyfikator zasobu maszyny wirtualnej. Gdy dysk zarządzany jest nieprzyłączone, właściwość ManagedBy ma wartość null. Skrypt sprawdza wszystkie dyski zarządzane w subskrypcji platformy Azure. Gdy skrypt lokalizuje dysk zarządzany z właściwością ManagedBy ustawioną na wartość null, skrypt określa, że dysk nie jest dołączony.

Ważne

Najpierw uruchom skrypt, ustawiając zmienną deleteUnattachedDisks na 0. Ta akcja umożliwia znajdowanie i wyświetlanie wszystkich niedołączonego dysku zarządzanego.

Po przejrzeniu wszystkich niedołączonego dysku uruchom skrypt ponownie i ustaw zmienną deleteUnattachedDisks na 1. Ta akcja umożliwia usunięcie wszystkich niedołączonego dysku zarządzanego.

# 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

Dyski niezarządzane: znajdowanie i usuwanie niedołączonych dysków

Dyski niezarządzane to pliki VHD przechowywane jako stronicowe obiekty blob na kontach usługi Azure Storage. Poniższy skrypt wyszukuje niedołączone dyski niezarządzane (stronicowe obiekty blob), sprawdzając wartość właściwości LeaseStatus . Gdy dysk niezarządzany jest dołączony do maszyny wirtualnej, właściwość LeaseStatus jest ustawiona na Wartość Zablokowana. Gdy niezarządzany dysk jest niezałączany, właściwość LeaseStatus jest ustawiona na Odblokowano. Skrypt sprawdza wszystkie niezarządzane dyski we wszystkich kontach usługi Azure Storage w subskrypcji platformy Azure. Gdy skrypt lokalizuje dysk niezarządzany z właściwością LeaseStatus ustawioną na Odblokowano, skrypt określa, że dysk nie jest dołączony.

Ważne

Najpierw uruchom skrypt, ustawiając zmienną deleteUnattachedVHDs na 0. Ta akcja umożliwia znajdowanie i wyświetlanie wszystkich niezarządzanych dysków VHD niezarządzanych.

Po przejrzeniu wszystkich niedołączonego dysku uruchom skrypt ponownie i ustaw zmienną deleteUnattachedVHDs na 1. Ta akcja umożliwia usunięcie wszystkich niezarządzanych dysków VHD niezarządzanych.

# 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 

Następne kroki

Aby uzyskać więcej informacji, zobacz Usuwanie konta magazynu.