3

它引起了我的注意,如果你創建一個新的虛擬機然後刪除它(及其關聯的資源),你確實需要而不是實際上刪除了相應的VHD文件 - - 該文件保留在blob存儲中,阻止了使用相同主機名的新機器的供應,並且浪費和未使用的存儲也花費了實際的金錢。我希望刪除虛擬機和虛擬機。刪除虛擬機後從Azure資源管理器中刪除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) 
    } 
} 
+0

如何刪除虛擬機?你用什麼命令? –

+0

爲了測試,我通過Web界面刪除虛擬機。就我(從最近)理解而言,這具有將VHD留在原地的惡劣後果。 – KlaymenDK

回答

4

天青資源管理的總體看法是,你停止思考的原子單位的資源,如虛擬機,存儲,網絡,而是開始將它們視爲一組資源。一個資源組,因爲它是;)

理論是,您創建一個模板,通過Rest,Powershell或模板文件創建一個完整的部署。

然後,不刪除虛擬機並重新創建虛擬機,而是刪除整個資源組,然後再次運行部署,您將返回到原來的位置。

它確實使整個事情更容易管理,並允許更復雜的構建。

使用該模型,如果刪除整個資源組,那麼將刪除所有底層資源,blob,存儲帳戶和網絡。

所以,就你的問題。

Azure不會像傳統管理器那樣創建磁盤。基本上你把機器指向一個blob vhd,就是這樣。所以你的命令的問題是沒有任何磁盤要刪除。

所以命令你想

Remove-AzureStorageBlob -Blob $diskname -Container vhds -Context $context 
+0

我已經考慮過這麼做了(每個虛擬機有一個專用資源組),但我現在提供的設置圍繞着許多虛擬機在一個組中。不過,我很可能會挑戰這一點,尤其是考慮到這樣的好動機。 – KlaymenDK

+0

您是否需要獨立添加和移除虛擬機?有沒有可以在他們周圍使用的任何分組。你可以把它們分成更大的羣體 - 你隨後可以把它看作一個整體 - 管理就會變得更簡單。 –

+0

是的,單獨;這些是運行(獨立)測試套件的測試機器。在任何時候都會有50-100個資源羣體出現問題,再加上一點營業額? – KlaymenDK

0

檢查服務器時鐘和客戶端時鐘

存儲服務保證的請求是年齡不超過15分鐘到達服務的時間。這防範了某些安全攻擊,包括重播攻擊。當此檢查失敗時,服務器返回響應代碼403(禁止)。

+0

我對這個問題如何涉及這個問題有點困惑? –

+0

我的假設是,當他厭倦了使用Remove-AzureDisk進行刪除時,他無法找到資源,可能是因爲時鐘,因此只需仔細檢查該部分。 –

+1

這是因爲它是ARM機器,它們沒有磁盤;) –

相關問題