我注意到,如果您创建一个新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)
}
}
答案 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(禁止)。