【问题标题】:Exclude list of Vms from script deleting snapshots in vmware从脚本中排除虚拟机列表删除 vmware 中的快照
【发布时间】:2019-06-10 08:31:30
【问题描述】:

我有一个 powercli 脚本,它计划删除早于 X 天的 VMs,最近我们得到了一个 VMs 列表,它们应该从快照删除中排除,因为这些是关键快照。 如何在我的脚本中引入参数 exclude VM 以将 VMS 与 Vcenter 中的快照与我提供的列表进行比较,并仅列出和删除符合不超过 X 天且不属于部分条件的 VMS排除VM 列表。

我比较新,使用下面的代码来获取超过 10 天的快照并删除它们。

# vCenter Server configuration
   $vcenter = "Vcenter Name"
$vcenteruser = "Domain\Userid"
$vcenterpw = "Password"

#Connect to the vCenter server defined above. Ignore certificate errors
Connect to vcenter Server connect-viserver $vcenter -User $vcenteruser -Password $vcenterpw"


Add-PSSnapin VMware.VimAutomation.Core -ErrorAction 'SilentlyContinue'
Clear-Host
$old_snapshots = Get-VM | Get-Snapshot |? { ([DateTime]::Now - $_.Created).TotalDays -gt 7 } | Remove-Snapshot: $old_snapshots | Remove-Snapshot -RunAsync -Confirm:$false    

我需要弄清楚如果我有一个包含 10 天以上快照且不应删除的“虚拟机”列表,该怎么办。我想排除那些“虚拟机”,但我不知道该怎么做。

所以我尝试使用 @I.T Delinquent 的逻辑。我在“$VmToIgnore”中输入了一个值,并将其与“Get-Vm”中收到的 VM 列表进行比较。如果为真则什么都不做,如果为假,则获取该 VM 的快照和其他属性并将其导出为 CSV。

$vmsToIgnore ="Vm1"
$e = Get-VM
    Foreach-Object {
    if ($vmsToIgnore -Contains $_.Name){  
        #Do nothing as VM name is in the vmsToIgnore list
    }else{

          $f = $e |get-Snapshot| Select-object 
         vm,VMId,name,Description,SizeGB,created

         $f| Export-Csv -Path "\\%path%\snapshot.csv"
    }
}

这仍然返回所有“VM”快照的列表,包括一个“$VMToIgnore”。

我一定是在这里犯了一些错误,因为它不应该在 Excel 中打印“$VmToIgnore”。

【问题讨论】:

  • 您能提供一些您已经尝试过的东西以及您遇到的具体问题吗?
  • 我已经用我正在使用的代码更新了我的问题。我试图找到一种方法从这个自动删除“VM”快照脚本中排除几个“VM”快照。但我不知道该怎么做。
  • 您收到的列表格式是什么? TXT? CSV?还有什么?列表会经常变化还是相对静止?
  • @TheSinghSyndrome 我已经更新了我的答案。请查看:)
  • 非常感谢@I.T Delinquent。这是我需要的工作。 :)

标签: powercli


【解决方案1】:

你能建立在这样的基础上吗:

$vmsToIgnore = "VM1","VM2"

$old_Snapshots = Get-VM | Foreach-Object {
    if ($vmsToIgnore -Contains $_.Name){  
        #Do nothing as VM name is in the vmsToIgnore list
    }else{
        #Perform tasks as vm isn't in vmsToIgnore list
    }
}

我不确定 Get-VM 会返回什么,所以请您可能需要编辑我的示例。这是它的基础,尽管假设 Get-VM 返回一个不错的 VM 列表:

$vmsToIgnore = "VM1","VM2"
$outputFromGetVM = "VM1","VM1.2","VM2","VM3"

foreach ($vm in $outputFromGetVM){
    if ($vmsToIgnore -contains $vm){
        Write-Host "Ignoring"
    }else{
        Write-Host "performing"
    }
}

如果您有任何问题,请告诉我

更新

我觉得这个可以用:

$vmsToIgnore = "Vm1"

Get-VM | ForEach-Object {
    if ($vmsToIgnore -contains $_.Name){
        #Do nothing as VM name is in the vmsToIgnore list
    }else{
        Get-Snapshot $_ | Select-Object vm, VmId, Name, Description, SizeGB, Created | Export-Csv -Path "\\path\to\file.csv"
    }
}

【讨论】:

  • 我尝试使用您提供的逻辑。这里的“Get-VM”获取 vCenter 中所有“VM”的列表。然后根据您的逻辑将其与 $VMsToIgnore 进行比较。如果匹配,则不执行任何操作。如果不匹配,则获取该“VM”的快照详细信息并将其导出为 CSV。我没有使用删除快照命令,因为 t 仅用于测试。所以我修改了脚本以仅获取“VM”快照详细信息。
  • '$vmsToIgnore ="Vm1" $e = Get-VM Foreach-Object { if ($vmsToIgnore -Contains $_.Name){ #Do nothing as VM name is in the vmsToIgnore list }else { $f = $e |获取快照|选择对象 vm,VMId,name,Description,SizeGB,created $f|导出-Csv -Path "\\%path%\snapshot.csv" } }'
  • @TheSinghSyndrome 你能用这些信息更新你的问题吗?另外,我不太了解您的 cmets 的目的。我的回答有问题吗?
  • 我再次更新了问题。对不起,我是新来的,所以还在学习。
【解决方案2】:

听起来您已经将 VM 名称作为列表,在这种情况下排除它们

$list = 获取虚拟机 |其中 {"name" -ne "mypreciousvm"}

你需要使用 -notmatch 或 -notcontains 我不记得你需要哪个。然后通过下面的排除列表。

$old_snapshots = 获取 VM -name $list |获取快照|? { ([DateTime]::Now - $_.Created).TotalDays -gt 7 } |删除快照:$old_snapshots | Remove-Snapshot -RunAsync -Confirm:$false

如果虚拟机来来去去很多,那么请尝试一次性完成,否则在重新获取虚拟机名称时可能会出错

$old_snapshots = 获取虚拟机 |其中 {$.name -notcontains $list}|获取快照|? { ([DateTime]::Now - $.Created).TotalDays -gt 7 } |删除快照:$old_snapshots | Remove-Snapshot -RunAsync -Confirm:$false

【讨论】:

    【解决方案3】:

    删除超过 3 天的快照

    Get-VM | Get-Snapshot | ? {$_.created -lt (Get-Date).AddDays(-3)} | Remove-Snapshot -Confirm:$false -RunAsync
    

    【讨论】:

    • 因为您只显示代码,所以不清楚这个答案与其他答案有何不同,显示的代码如何工作以及为什么它应该解决顶部问题中描述的问题这个页面的。请根据How to Answer 此处的信息edit。如果您有时间,请务必使用强烈推荐的tour
    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2015-01-07
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多