Share via


Trovare ed eliminare dischi gestiti e non gestiti di Azure che non sono collegati tramite l'interfaccia della riga di comando di Azure

Si applica a: ✔️ macchine virtuali di Linux ✔️ set di scalabilità flessibili

Quando si elimina una macchina virtuale (VM) in Azure, per impostazione predefinita, nessun disco collegato alla macchina virtuale viene eliminato. Questa funzionalità consente di prevenire la perdita di dati a causa dell'eliminazione accidentale di macchine virtuali. Dopo l'eliminazione di una macchina virtuale, si continuerà a pagare per i dischi scollegati. Questo articolo illustra come trovare ed eliminare tutti i dischi scollegati e ridurre i costi non necessari.

Nota

È possibile usare il comando az disk show per ottenere LastOwnershipUpdateTime per qualsiasi disco. Questa proprietà rappresenta l'ultimo aggiornamento dello stato del disco. Per un disco scollegato, viene visualizzato l'ora in cui il disco è stato scollegato. Questa proprietà è vuota per i dischi appena creati, fino a quando lo stato non cambia.

Dischi gestiti: trovare ed eliminare dischi scollegati

Lo script seguente cerca i dischi gestiti non collegati esaminando il valore della proprietà ManagedBy. Quando un disco gestito è collegato a una macchina virtuale, la proprietà ManagedBy contiene l'ID risorsa della macchina virtuale. Quando un disco gestito è scollegato, la proprietà ManagedBy è null. Lo script esamina tutti i dischi gestiti in una sottoscrizione di Azure. Quando lo script individua un disco gestito con la proprietà ManagedBy impostata su null, lo script determina che il disco è scollegato.

Importante

In primo luogo, eseguire lo script impostando la variabile deleteUnattachedDisks su 0. Questa azione consente di individuare e visualizzare tutti i dischi gestiti scollegati.

Dopo aver verificato tutti i dischi scollegati, eseguire nuovamente lo script e impostare la variabile deleteUnattachedDisks su 1. Questa azione consente di eliminare tutti i dischi gestiti scollegati.

# 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

Dischi non gestiti: Trovare ed eliminare i dischi scollegati

I dischi non gestiti sono file disco rigido virtuale che sono archiviati come BLOB di pagine negli account di archiviazione di Azure. Lo script seguente cerca i dischi non gestiti scollegati (BLOB di pagine) esaminando il valore della proprietà LeaseStatus. Quando un disco non gestito è collegato a una macchina virtuale, la proprietà LeaseStatus è impostata su Bloccato. Quando un disco non gestito è scollegato, la proprietà LeaseStatus è impostata su Sbloccato. Lo script esamina tutti i dischi non gestiti in tutti gli account di archiviazione di Azure in una sottoscrizione di Azure. Quando lo script individua un disco non gestito con la proprietà LeaseStatus impostata su Sbloccato, lo script determina che il disco è scollegato.

Importante

In primo luogo, eseguire lo script impostando la variabile deleteUnattachedVHDs su 0. Questa azione consente di individuare e visualizzare tutti i dischi rigidi virtuali non gestiti scollegati.

Dopo aver verificato tutti i dischi scollegati, eseguire nuovamente lo script e impostare la variabile deleteUnattachedVHDs su 1. Questa azione consente di eliminare tutti i dischi rigidi virtuali non gestiti scollegati.

# 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 

Passaggi successivi

Per altre informazioni, vedere Eliminare un account di archiviazione.