在上次开机日期之前自动删除Azure中未使用的VM及其资源

时间:2019-11-21 14:47:11

标签: azure azure-functions azure-virtual-machine azure-powershell azure-automation

我需要创建一个自动化机制,以删除过去两个星期内未启动的VM及其相关资源(例如,网络接口或磁盘等),并将其放在单个资源组中。我曾考虑过在自动化帐户中使用Powershell Runbook,但是存在一些问题,我找不到Powershell命令来检查资源组中所有VM的上次启动日期,也找不到Powershell命令来删除VM及其所有虚拟机相关资源。 如果我有这两个,我可以制作一个Powershell Runbook,它将检查VM的上一次启动时间,如果日期超过两周,它将自动删除它及其相关资源。 有谁知道如何完成这两件事,或者也许知道以不同的方式做到这一点?

2 个答案:

答案 0 :(得分:1)

没有简单的方法可以做到这一点(因此,没有cmdlet可以完成您需要的任何一项操作)。您需要编写这两个操作的脚本。

您可能需要使用Get-AzVm并解析输出以弄清何时打开电源(不确定api中是否公开了)以及类似的https://adamtheautomator.com/remove-azure-virtual-machine-powershell/

答案 1 :(得分:0)

我对此进行了一些搜索,最终创建了可以完成此任务的脚本:


$rgName = "resource group name"
$VMs = Get-AzVM -ResourceGroupName $rgName | ? {$_.Tags.Keys -notcontains "DontDelete"}

#$VMs = $VMs | ? {$_.Name -eq 'ePO'}

foreach ($VM in $VMs)
{
    $vmName = $VM.Name
    $vmID = $VM.Id

    Get-AzVM -VMName $vmName | Stop-AzVM -Force

    #################################################################################### 
    $nicID = $VM.NetworkProfile.NetworkInterfaces.id   

    ####################################################################################    
    $diskID = $VM.StorageProfile.OsDisk.ManagedDisk.Id

    $snapshotConfig = New-AzSnapshotConfig -SourceUri $diskID -Location $VM.Location -CreateOption copy
    $snapshot = New-AzSnapshot -Snapshot $snapshotConfig -SnapshotName "$vmName-snapshot" -ResourceGroupName $VM.ResourceGroupName

    ####################################################################################
    Remove-AzResource -ResourceId $vmID -Force
    Remove-AzResource -ResourceId $nicID -Force
    Remove-AzResource -ResourceId $diskID -Force
}

决定,我将对不想删除的VM使用“ DontDelete”标签,而不是最后一次开机日期,其余的及其相关资源也将被删除。 我将此脚本添加到了自动化帐户中的运行簿中,并运行了它,效果很好。