Поделиться через


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

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

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

Примечание.

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

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

В следующем скрипте показано, как с помощью свойства 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-файлы, которые хранятся в учетных записях хранения Azure как страничные BLOB-объекты. В следующем скрипте показано, как с помощью свойства LeaseStatus найти неподключенные неуправляемые диски (страничные BLOB-объекты). Если неуправляемый диск подключен к виртуальной машине, свойство LeaseStatus имеет значение Locked. Если неуправляемый диск не подключен к виртуальной машине, свойство LeaseStatus имеет значение Unlocked. Сценарий проверяет все неуправляемые диски во всех учетных записях хранения Azure в подписке Azure. Когда скрипт находит неуправляемый диск со значением свойства LeaseStatus равным Unlocked, он определяет, что диск не подключен.

Внимание

Сначала запустите скрипт, установив для переменной 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 

Следующие шаги

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