Auditando Hyper-V a través de SCOM

 

Para mantener un entorno en su mejor estado posible y asegurarnos de evitarnos problemas siempre hay que seguir las buenas practicas recomendadas, además en muchos casos pueden ser necesarias configuraciones especificas para respetar las políticas y metodologías de administración de cada empresa o para cumplir con requisitos técnicos del entorno.

En este post os voy a enseñar un script de powershell que audita una serie de configuraciones que un cliente real quería asegurarse que siempre cumplía su entorno, estas eran:

  • Ninguna VM puede no tener un centro de coste configurado
  • Todas las VMs tienen que tener un dueño (owner)
  • Dado que los clusters tenían hosts con diferentes tipos de procesador es imprescindible que todas las VMs estén configuradas para poder migrar a hosts son procesadores diferentes
  • Se decidió que las optimizaciones de red estarían desactivadas por defecto en todas las VMs
  • No puede haber VMs con discos dinámicos

El script registra eventos en el registro de eventos del servidor donde corre (en este caso el servidor de SCVMM), en cada evento esta la lista de VMs que no cumplen con la política.

  
 #Hyper-V Auditoria autor: Daniel Matey
  
 Add-PSSnapin Microsoft.SystemCenter.VirtualMachineManager
 get-vmmserver -ComputerName TuServidorSCVMM
  
  
 $VMsSinCostCenter= get-vm |where-object {!$_.CostCenter  } |fl name |out-string
 $VMsSinOwner=get-vm |where-object {$_.Owner -eq "Unknown"  } |fl name |out-string
 $VMsSinCPUCompatible=get-vm |where-object {$_.LimitCPUForMigration -eq $False  } |fl name |out-string
 $VMsConOptimizaciones = get-vm | get-virtualnetworkadapter |where-object {$_.VMNetworkOptimizationEnabled -eq $False} |fl Name |out-string
 $VMsDiscoDinamico= get-vm | get-virtualHardDisk |where-object {$_.VHDType -eq "DynamicallyExpanding"} |fl Directory|out-string
  
 if ($VMsSinCostCenter)
 {
     $evt=new-object System.Diagnostics.EventLog("Application")
     $evt.Source="AuditoriaHyper-V"
     $infoevent=[System.Diagnostics.EventLogEntryType]::Warning
     $evt.WriteEntry("VMs Sin Cost Center`r`n" + $VMsSinCostCenter ,$infoevent,1)
  
 }
  
 if ($VMsSinOwner)
 {
     $evt=new-object System.Diagnostics.EventLog("Application")
     $evt.Source="AuditoriaHyper-V"
     $infoevent=[System.Diagnostics.EventLogEntryType]::Warning
     $evt.WriteEntry("VMs Sin Owner`r`n" + $VMsSinOwner ,$infoevent,2)
  
 }
  
 if ($VMsSinCPUCompatible)
 {
     $evt=new-object System.Diagnostics.EventLog("Application")
     $evt.Source="AuditoriaHyper-V"
     $infoevent=[System.Diagnostics.EventLogEntryType]::Warning
     $evt.WriteEntry("VMs CPU no compatible con diferentes hosts `r`n" + $VMsSinCPUCompatible ,$infoevent,3)
  
 }
  
 if ($VMsConOptimizaciones)
 {
     $evt=new-object System.Diagnostics.EventLog("Application")
     $evt.Source="AuditoriaHyper-V"
     $infoevent=[System.Diagnostics.EventLogEntryType]::Warning
     $evt.WriteEntry("VMs con optimizaciones de red `r`n" + $VMsConOptimizaciones ,$infoevent,4)
  
 }
  
 if ($VMsDiscoDinamico)
 {
     $evt=new-object System.Diagnostics.EventLog("Application")
     $evt.Source="AuditoriaHyper-V"
     $infoevent=[System.Diagnostics.EventLogEntryType]::Warning
     $evt.WriteEntry("VMs con discos dinamicos `r`n" + $VMsDiscoDinamico ,$infoevent,5)
  
 }

Ahora es tan simple como configurar SCOM para que corra este script cada cierto tiempo y para que lance alertas cuando detecte los eventos, por supuesto podéis también configurar subscripciones para que os lleguen las alertas por correo:

image

Un saludo a todos!