删除VM

时间:2016-02-04 15:07:06

标签: powershell azure azure-powershell azure-resource-manager

我注意到,如果您创建一个新VM然后将其删除(及其相关资源),那么实际上会删除相应的VHD文件 - 该文件是留在blob存储中,阻止使用相同的主机名配置新机器,并且还浪费了浪费和未使用存储的真实资金。我希望删除VHD以及VM。

在哪里可以找到关于如何处理此问题的当前智慧的好记录?我所能找到的只是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)
    }
}

2 个答案:

答案 0 :(得分:4)

Azure资源管理的一般智慧是,您不再考虑原子单元中的资源,如虚拟机,存储,网络,而是开始将它们视为一组资源。资源组,因为它;)

理论上,您可以创建一个模板,通过Rest,Powershell或模板文件一次创建整个部署。

然后,不是删除VM并重新创建它,而是删除整个资源组,然后再次运行部署,您将回到原来的位置。

它确实使整个事情更易于管理,并允许更复杂的构建。

使用该模型,如果删除整个资源组,则将删除所有底层资源,blob,存储帐户和网络。

所以,关于你的问题。

Azure不会像经典管理器那样创建磁盘。基本上你把机器指向一个blob vhd就是这样。所以你的命令的问题是没有任何要删除的磁盘。

所以你想要的命令

// 1
private final static DateTimeFormat timeFormat1 = DateTimeFormat.getFormat("h:mm aa");

// 2
private final static DateTimeFormat timeFormat2 = DateTimeFormat.getFormat(PredefinedFormat.TIME_SHORT);

public static void convertToShortTimeFormat(Date d) {
    if (d != null) {
        GWT.log(timeFormat1.format(d));  // displays localized format "10:30 vorm" in German
        GWT.log(timeFormat2.format(d));  // displays "19:30" for example
    }
}

答案 1 :(得分:0)

检查服务器时钟和客户端时钟

存储服务确保请求在到达服务时不超过15分钟。这可以防范某些安全攻击,包括重放攻击。当此检查失败时,服务器返回响应代码403(禁止)。