Поиск и удаление неподключенных управляемых и неуправляемых дисков Azure с помощью Azure CLI

Область применения: ✔️ Виртуальные машины Linux ✔️ Гибкие масштабируемые наборы

При удалении виртуальной машины в Azure по умолчанию все диски, подключенные к виртуальной машине, не удаляются. Это предотвращает потерю данных из-за случайного удаления виртуальной машины. После удаления виртуальной машины вы будете продолжать платить за неподключенные диски. В этой статье показано, как найти и удалить все неподключенные диски и сократить ненужные затраты.

Замечание

Используйте команду az disk show, чтобы получить LastOwnershipUpdateTime для любого диска. Это свойство показывает, когда состояние диска было обновлено в последний раз. Для неподключаемого диска это свойство показывает время, когда диск был отключен. Это свойство пусто для только что созданных дисков, пока их состояние не изменится.

Управляемые диски: поиск и удаление неподключенных дисков

Следующий скрипт ищет неподключенные управляемые диски , проверяя значение свойства ManagedBy . При присоединении управляемого диска к виртуальной машине свойство ManagedBy содержит идентификатор ресурса виртуальной машины. Если управляемый диск не подключен, свойство ManagedBy имеет значение NULL. Сценарий проверяет все управляемые диски в подписке Azure. Когда сценарий находит управляемый диск со свойством ManagedBy , установленным значение NULL, скрипт определяет, что диск не подключен.

Это важно

Сначала запустите скрипт, задав переменную deleteUnattachedDisks значение 0. Это действие позволяет найти и просмотреть все неподключенные управляемые диски.

После проверки всех неподключенных дисков запустите скрипт еще раз и установите для переменной deleteUnattachedDisks значение 1. Это действие позволяет удалить все неподключенные управляемые диски.

# 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

Неуправляемые диски: поиск и удаление неподключенных дисков

Неуправляемые диски — это VHD-файлы, хранящиеся в виде страничных BLOB-объектов в учетных записях хранения Azure. Следующий скрипт ищет неприсоединенные неуправляемые диски (страничные BLOB-объекты), проверяя значение свойства LeaseStatus. При присоединении неуправляемого диска к виртуальной машине свойство LeaseStatusзаблокировано. Если неуправляемый диск не подключен, свойство LeaseStatusразблокировано. Скрипт проверяет все неуправляемые диски во всех учетных записях хранения Azure в подписке Azure. Когда скрипт находит неуправляемый диск со свойством LeaseStatus , заданным как "Разблокированный", скрипт определяет, что диск не подключен.

Это важно

Сначала запустите скрипт, задав переменную deleteUnattachedVHDs значение 0. Это позволяет найти и просмотреть все неуправляемые виртуальные жесткие диски.

После проверки всех неподключенных дисков запустите скрипт еще раз и задайте для переменной deleteUnattachedVHDs значение 1. При этом удаляются все отсоединенные неуправляемые виртуальные жесткие диски.

# 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 

Дальнейшие шаги

Дополнительные сведения см. в разделе "Удаление учетной записи хранения".