До моего сведения было доведено, что если вы создаете новую виртуальную машину, а затем удаляете ее (и связанные с ней ресурсы), вы фактически не удаляете соответствующий VHD-файл — этот файл остается в большом двоичном объекте. хранилище, блокируя предоставление новой машины с тем же именем хоста, а также тратя реальные деньги на потраченное впустую и неиспользуемое хранилище. Я хочу удалить виртуальные жесткие диски вместе с виртуальными машинами.
Где я могу найти хороший обзор современных советов о том, как с этим бороться? Все, что я могу найти, это ссылки до 2013 года, которые явно нацелены на «классическую» версию.
Я написал следующий код, чтобы попытаться исправить эту ситуацию. У меня есть два варианта использования, во-первых, я должен избавиться от всего накопившегося хлама, а после этого мне «просто» нужно обязательно очищать после каждой будущей машины при ее удалении.
write-output("Removing orphaned disks for hostname ""$hostname"" ...")
$storageContext = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -match $azureStorage}).Context
$storageBlob = Get-AzureStorageBlob -Context $storageContext -Container "vhds"
$vhdList = $storageBlob | Where-Object{$_.Name -match "$hostname"}
foreach($disk in $vhdList) {
$diskname = $disk.Name
write-output("Removing VHD ""$diskname"" ...")
Remove-AzureDisk -Diskname "$diskname" -DeleteVHD
write-output("Removed VHD ""$diskname"" ... [OK]")
}
write-output("Removed orphaned disks ... [OK]")
Теперь, когда я запускаю это, я получаю хорошие списки файлов VHD, которые я ожидаю увидеть (а также некоторые соответствующие файлы «*.status»). Однако команда Remove-AzureDisk
выдает ошибку Remove-AzureDisk : ResourceNotFound: The disk with the specified name does not exist
, поэтому на самом деле она не работает.
Вы заметите, что я переключаюсь с новых команд «ARM» на «классическую» версию на полпути — это, вероятно, часть моей проблемы, но мне не повезло придумать лучшие команды.
Обновление:
Кажется, это помогает:
# Verify that the OS VHD does not already exist
write-output("Checking for blocking VHD's ...")
$storageContext = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -match $azureStorage}).Context
$storageBlob = Get-AzureStorageBlob -Context $storageContext -Container "vhds"
$vhdList = $storageBlob | Where-Object{$_.Name -match "$hostname"}
if ($vhdList) {
write-output("There is an existing VHD blocking host ""$hostname"" in storage container ""$($storageContext.BlobEndPoint)vhds""):")
foreach($vhdName in $vhdList.Name) {
write-output("- $vhdName")
}
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
$answer = [System.Windows.Forms.MessageBox]::Show("There is an existing VHD blocking host ""$hostname"" in storage container ""$($storageContext.BlobEndPoint)vhds"").`nDo you wish to remove the existing VHD file?" , "Create New VM" , $MB_YESNO)
if ($answer -eq "YES" ) {
# Remove VHD files
foreach($diskName in $vhdList.Name) {
write-output("- Removing VHD ""$diskName""")
Remove-AzureStorageBlob -Blob $diskName -Container "vhds" -Context $storageContext
}
write-output("Checked for blocking VHD's ... [OK]")
} else {
exit(331)
}
}