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.