Komplexný webový report

“Pridal som VM do správnej OU v AD? Má nainštalovaného AV clienta? Backupuje sa? Je zadaný v spravnych patchovacích skupinách? Vytvoril som asset v Asset managemente? S akou prioritou? Monitoruje sa?”

To sú otázky, ktoré si kladie nejeden administrátor alebo mu ich rovno kladie jeho nadriadený. Nejaký čas mi trvalo, kým som prišiel na nejaký jednoduchý spôsob, no podarilo sa a túto pomôcku používam minimálne raz týždenne.

Report je generovaný ako HTML súbor. Hodí sa mať nainštalovanú rolu IIS alebo iného Web Servera.

Moduly ktoré sú potrebné naimportovat:

  • VMware.VimAutomation.Core
  • PoshWSUS (modul ktorý používame pre managovanie WSUS servera)
  • ActiveDirectory

Príklad $ServerPatchList :

Name,Group,Time,email,Restart,Platform
Server1,TestGroup,18:00,name@yourcompany.com,RESTART,virtual
Server2,TestGroup,19:00,name@yourcompany.com,RESTART,virtual

Príklad $Assets ktorý nám generujú kolegovia z tímu Asset Management.

OS-Server1,3,t
OS-Server2,3,t

Zoznam informácií ktoré scriptom viete získať:

  • Meno VM
  • Uptime danej VM
  • Informácia, či je VM v $ServerPatchList
  • Informácia, či je VM v niektorej skupine vo WSUS
  • Dátum a čas, kedy VM naposledy reportovala svoj status do WSUS
  • Informácia, či je prítomný AntiVirus klient
  • Informácia, či je VM vo vCenter adresari a teda v našom prípade či je zálohovaná
  • Informácia o umiestnení VM (resp. jej Computer Object) v AD OU
  • Informácia, či je VM (resp. jej Computer Object) v AD skupine, ktorá zabezpečuje automatické NEreštartovanie servera po patchovaní
  • Priorita daného Assetu ak je vytvorený
  • Informácia, či je daná VM monitorovaná

Je možné, že nebudete rozumieť všetkému v scripte, preto ma neváhajte kontaktovať. Či už e-mailom alebo v komentároch.

### Nacitanie potrebneho modulu
add-pssnapin VMware.VimAutomation.Core
Import-Module PoshWsus
Import-Module ActiveDirectory

### Connect na vCenter
connect-VIserver -server <vcenter server>
### Connect na WSUS
Connect-PoshWSUSServer <wsus server>

$ServerPatchList = Import-Csv 'C:\Scripts\Import\Servers.txt'
$Assets = Import-Csv 'C:\Scripts\Import\Assets\exp_select.csv' -Header Asset,Priority,Monitored
$Assets | ForEach-Object {
if ($_.Asset -like "OS-*" -or $_.Asset -like "SE-*") {$_.Asset = $_.Asset.Substring(3)}
}

$style = "<style>BODY{font-family:Arial;font-size:10pt;}"
$style = $style + "TABLE{border:1px solid black;border-collapse:collapse;}"
$style = $style + "TH{border:1px solid black;background:#dddddd;padding:5px;}"
$style = $style + "TD{border:1px solid black;padding:5px;}"
$style = $style + "tr:nth-child(odd) { background-color:#d3d3d3;}"
$style = $style + "tr:nth-child(even) { background-color:white;}"
$style = $style + "</style>"

$body = "<body><b>Naposledy generovane:</b> $(Get-Date) <br><br>"
$body = $body + "</head>"

$Servers = Get-VMGuest (Get-VM) | Where-Object {$_.State -eq "Running" -and ($_.OSFullName -notlike 'Microsoft Windows Server 2003*' -and $_.OSFullName -notlike "*Linux*" -and $_.OSFullName -notlike "*FreeBSD*") }
$WSUSServerGroup = Get-PoshWSUSClientsInGroup -Name ServerGroup
$WSUSTestGroup = Get-PoshWSUSClientsInGroup -Name TestGroup
$WSUSCtxServer = Get-PoshWSUSClientsInGroup -Name CtxServer

$ADOU = @{ N="AD OU"
E={($Split=((Get-ADComputer -Identity $_.VmName).distinguishedname -split "(,)"))[2..($Split.Length-5)] -join ''}
}

$Priority = @{ N="Priority"
E={ if ($Assets.Asset -eq  $_.VM ){
$VM = $_.VM
$Asset = $Assets | Where-Object {$_.Asset -eq $VM}
$Asset.Priority
}
}
}

$Monitored = @{ N="Monitored"
E={ if ($Assets.Asset -eq  $_.VM ){
$VM = $_.VM
$Asset = $Assets | Where-Object {$_.Asset -eq $VM}
if ($Asset.Monitored -eq "t"){
$true
}
else {$false}
}
}
}

$serv = $Servers | Select-Object `
VM,`
@{ N="Uptime";E={((get-date) - [System.Management.ManagementDateTimeconverter]::ToDateTime((Get-WMIObject -Class Win32_OperatingSystem -ComputerName $_.VM -ErrorAction SilentlyContinue).LastBootUpTime)).days}},`
@{ N="PatchingList";E={$ServerPatchList.Name -contains $_.VM} },`
@{ N="PatchingGroup";E={$WSUSServerGroup.FullDomainName -contains $_.HostName -or $WSUSTestGroup.FullDomainName -contains $_.HostName -or $WSUSCtxServer.FullDomainName -contains $_.HostName } },`
@{ N="PatchingLastReport";E={(Get-PoshWSUSClient $_.VM).LastReportedStatusTime} },`
@{ N="AV";E={Get-Service -Name MenoSluzbyAntivirusu -ComputerName $_.HostName} },`
@{ N="Backup";E={(Get-VM $_.VM).Folder} },`
$ADOU,`
@{ N="SUS NO RESTART";E={(Get-ADGroupMember "SUS NO RESTART").name -contains $_.VM} },`
$Priority,`
$Monitored
$s = $serv | Sort-Object -Property VM

$sHTML = $s | ConvertTo-Html -Head $style -Body $body | Out-File C:\inetpub\wwwroot\ServersReportTest.html

Author: Martin

Infrastructure engineer | virtualization & cloud enthusiast | vSphere specialist | blogger | Veeam Vanguard 2021,2022,2023 | VMware vExpert 2017 - 2023 | VMCE | Slovak VMUG Leader |  user group ambassador for kmug.sk | husband&father