千家信息网

PowerShell 发送美观的Vsphere DataStore警报

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,豆子今天登陆Vsphere VCenter的时候,无意中发现有DataStore的警报信息,个别DataStore的使用空间超过90%了,需要清空一下SAN Volume的Snapshot。这个是运维
千家信息网最后更新 2024年11月17日PowerShell 发送美观的Vsphere DataStore警报

豆子今天登陆Vsphere VCenter的时候,无意中发现有DataStore的警报信息,个别DataStore的使用空间超过90%了,需要清空一下SAN Volume的Snapshot。这个是运维常见的问题,那么顺便就用PowerShell写个脚本,定期检查发送邮件好了。


脚本本身很容易,但是我想让他尽量的美观一些。

之前我写过一个博文可以自定义sytle的样式 http://beanxyz.blog.51cto.com/5570417/1786712, 不过现在看起来有些麻烦,还是觉得找找如果有比较好看的现成的css文件可以直接调用就好了。


上网搜了搜 table有哪些现成的css模板,随便找了一个https://codepen.io/anon/pen/vJmLWL,看着还成

下载他的css下来

下载的css文件,保存在C:\tmp 目录


@import url(https://fonts.googleapis.com/css?family=Roboto:400,500,700,300,100);body {  background-color: #3e94ec;  font-family: "Roboto", helvetica, arial, sans-serif;  font-size: 16px;  font-weight: 400;  text-rendering: optimizeLegibility;}div.table-title {   display: block;  margin: auto;  max-width: 600px;  padding:5px;  width: 100%;}.table-title h4 {   color: #fafafa;   font-size: 30px;   font-weight: 400;   font-style:normal;   font-family: "Roboto", helvetica, arial, sans-serif;   text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.1);   text-transform:uppercase;}/*** Table Styles **/.table-fill {  background: white;  border-radius:3px;  border-collapse: collapse;  height: 200px;  margin: auto;  max-width: 600px;  padding:5px;  width: 100%;  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);  animation: float 5s infinite;} th {  color:#D5DDE5;;  background:#1b1e24;  border-bottom:4px solid #9ea7af;  border-right: 1px solid #343a45;  font-size:23px;  font-weight: 100;  padding:24px;  text-align:left;  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);  vertical-align:middle;}th:first-child {  border-top-left-radius:3px;} th:last-child {  border-top-right-radius:3px;  border-right:none;}  tr {  border-top: 1px solid #C1C3D1;  border-bottom-: 1px solid #C1C3D1;  color:#666B85;  font-size:16px;  font-weight:normal;  text-shadow: 0 1px 1px rgba(256, 256, 256, 0.1);} tr:hover td {  background:#4E5066;  color:#FFFFFF;  border-top: 1px solid #22262e;  border-bottom: 1px solid #22262e;} tr:first-child {  border-top:none;}tr:last-child {  border-bottom:none;} tr:nth-child(odd) td {  background:#EBEBEB;} tr:nth-child(odd):hover td {  background:#4E5066;}tr:last-child td:first-child {  border-bottom-left-radius:3px;} tr:last-child td:last-child {  border-bottom-right-radius:3px;} td {  background:#FFFFFF;  padding:20px;  text-align:left;  vertical-align:middle;  font-weight:300;  font-size:18px;  text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.1);  border-right: 1px solid #C1C3D1;}td:last-child {  border-right: 0px;}th.text-left {  text-align: left;}th.text-center {  text-align: center;}th.text-right {  text-align: right;}td.text-left {  text-align: left;}td.text-center {  text-align: center;}td.text-right {  text-align: right;}


下面是正式的脚本,Set-CellColor也是别人写好的现成的,我直接拿来用了,主要功能是根据条件来更改html文件table的格子的颜色,比如某个值大于警报线就标记为红色等等。脚本中间加载Vsphere SnapIn,查询datastore的状态,最后把结果转换为html,通过Office365发送邮件出去



#修改颜色块的设定Function Set-CellColor{       [CmdletBinding()]    Param (        [Parameter(Mandatory,Position=0)]        [string]$Property,        [Parameter(Mandatory,Position=1)]        [string]$Color,        [Parameter(Mandatory,ValueFromPipeline)]        [Object[]]$InputObject,        [Parameter(Mandatory)]        [string]$Filter,        [switch]$Row    )        Begin {        Write-Verbose "$(Get-Date): Function Set-CellColor begins"        If ($Filter)        {   If ($Filter.ToUpper().IndexOf($Property.ToUpper()) -ge 0)            {   $Filter = $Filter.ToUpper().Replace($Property.ToUpper(),"`$Value")                Try {                    [scriptblock]$Filter = [scriptblock]::Create($Filter)                }                Catch {                    Write-Warning "$(Get-Date): ""$Filter"" caused an error, stopping script!"                    Write-Warning $Error[0]                    Exit                }            }            Else            {   Write-Warning "Could not locate $Property in the Filter, which is required.  Filter: $Filter"                Exit            }        }    }        Process {        ForEach ($Line in $InputObject)        {   If ($Line.IndexOf("(.*?)<\/th>' -AllMatches                $Index = 0                ForEach ($Match in $Search.Matches)                {   If ($Match.Groups[1].Value -eq $Property)                    {   Break                    }                    $Index ++                }                If ($Index -eq $Search.Matches.Count)                {   Write-Warning "$(Get-Date): Unable to locate property: $Property in table header"                    Exit                }                Write-Verbose "$(Get-Date): $Property column found at index: $Index"            }            If ($Line -match "(.*?)<\/td>' -AllMatches                $Value = $Search.Matches[$Index].Groups[1].Value -as [double]                If (-not $Value)                {   $Value = $Search.Matches[$Index].Groups[1].Value                }                If (Invoke-Command $Filter)                {   If ($Row)                    {   Write-Verbose "$(Get-Date): Criteria met!  Changing row to $Color..."                        If ($Line -match "")                        {   $Line = $Line -replace "","")                        }                    }                    Else                    {   Write-Verbose "$(Get-Date): Criteria met!  Changing cell to $Color..."                        $Line = $Line.Replace($Search.Matches[$Index].Value,"$Value")                    }                }            }            Write-Output $Line        }    }        End {        Write-Verbose "$(Get-Date): Function Set-CellColor completed"    }}#加载Vspherefunction Load-PowerCLI{    #pls download and install module first    Add-PSSnapin VMware.VimAutomation.Core   # Add-PSSnapin VMware.VimAutomation.Vds   # Add-PSSnapin VMware.VumAutomation    . "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1"}#判断是否已经加载SnapIn$snapins=Get-PSSnapinif($snapins.name -eq "VMware.VimAutomation.Core"){    Write-Host "Vsphere SnapIn is loaded" -ForegroundColor Cyan}else{    Load-PowerCLI}#绑定VCenterConnect-VIServer sydvcs2012#获取DataStore的数据$report = @()foreach($cluster in Get-Cluster){    Get-VMHost -Location $cluster | Get-Datastore | %{        $info = "" | select DataCenter, Cluster, Name, Capacity, Free, 'UsagePercentage(%)'        $info.Datacenter = $_.Datacenter        $info.Cluster = $cluster.Name        $info.Name = $_.Name         $info.Capacity = [math]::Round($_.capacityMB/1024,2)         $info.Free="{0:N1}" -f $_.FreeSpaceGB        $info.'UsagePercentage(%)'=[math]::round(100*($_.CapacityGB-$_.FreeSpaceGB)/$_.CapacityGB,2)        $report += $info    }}#通过Office365发送邮件$from = "aaa@abc.com"$to = "bean@abc.com"$smtp = "smtp.office365.com" $sub = "DataStore list" $secpasswd = ConvertTo-SecureString "Password" -AsPlainText -Force $mycreds = New-Object System.Management.Automation.PSCredential ($from, $secpasswd)#指定css模板转换数据为html格式,根据条件指定cell的颜色$htmlbody=$report| ConvertTo-Html -Body "

DataStore

" -CssUri C:\tmp\table.css | Set-CellColor -Property "UsagePercentage(%)" -Color red -Filter "UsagePercentage(%) -gt 80" #发送邮件Send-MailMessage -To $to -From $from -Subject $sub -Body ($htmlbody|Out-String) -Credential $mycreds -SmtpServer $smtp -DeliveryNotificationOption Never -BodyAsHtml -UseSsl -port 587


我收到的邮件效果



最后添加脚本到task scheduler里面让他每日自动运行就行了


0