Localizar e excluir discos gerenciados e não gerenciados do Azure não anexados usando a CLI do Azure

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

Quando você exclui uma máquina virtual (VM) no Azure, por padrão, todos os discos anexados à VM não são excluídos. Esta funcionalidade ajuda a prevenir a perda de dados devido à eliminação não intencional de VMs. Depois que uma VM for excluída, você continuará a pagar por discos não conectados. Este artigo mostra como localizar e excluir discos desconectados e reduzir custos desnecessários.

Nota

Você pode usar o comando az disk show para obter o LastOwnershipUpdateTime para qualquer disco. Esta propriedade representa quando o estado do disco foi atualizado pela última vez. Para um disco desconectado, isso mostra a hora em que o disco foi desconectado. Esta propriedade fica em branco para discos recém-criados, até que seu estado mude.

Discos gerenciados: localizar e excluir discos não conectados

O script a seguir procura discos gerenciados não anexados examinando o valor da propriedade ManagedBy. Quando um disco gerenciado é anexado a uma VM, a propriedade ManagedBy contém a ID do recurso da VM. Quando um disco gerenciado é desanexado, a propriedade ManagedBy é null. O script examina todos os discos gerenciados em uma assinatura do Azure. Quando o script localiza um disco gerenciado com a propriedade ManagedBy definida como null, o script determina que o disco está desanexado.

Importante

Primeiro, execute o script definindo a variável deleteUnattachedDisks como 0. Esta ação permite localizar e visualizar todos os discos gerenciados desanexados.

Depois de revisar todos os discos desanexados, execute o script novamente e defina a variável deleteUnattachedDisks como 1. Essa ação permite excluir todos os discos gerenciados não conectados.

# 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

Discos não geridos: localizar e eliminar discos desanexados

Discos não gerenciados são arquivos VHD armazenados como blobs de página em contas de armazenamento do Azure. O script a seguir procura discos não gerenciados não anexados (blobs de página) examinando o valor da propriedade LeaseStatus . Quando um disco não gerenciado é anexado a uma VM, a propriedade LeaseStatus é definida como Locked. Quando um disco não gerenciado é desanexado, a propriedade LeaseStatus é definida como Desbloqueado. O script examina todos os discos não gerenciados em todas as contas de armazenamento do Azure em uma assinatura do Azure. Quando o script localiza um disco não gerenciado com uma propriedade LeaseStatus definida como Desbloqueado, o script determina que o disco está desanexado.

Importante

Primeiro, execute o script definindo a variável deleteUnattachedVHDs como 0. Esta ação permite localizar e visualizar todos os VHDs não gerenciados não conectados.

Depois de revisar todos os discos desanexados, execute o script novamente e defina a variável deleteUnattachedVHDs como 1. Essa ação permite excluir todos os VHDs não gerenciados não anexados.

# 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 

Próximos passos

Para obter mais informações, consulte Excluir uma conta de armazenamento.