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下来

wKiom1mKniWQ91A9AACDNAfVm2M863.jpg

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
@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 h3 {
    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发送邮件出去



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#修改颜色块的设定
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( "<tr><th" -ge  0)
             {    Write-Verbose  "$(Get-Date): Processing headers..."
                 $Search  $Line  Select-String  -Pattern  '<th ?[a-z\-:;"=]*>(.*?)<\/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 " <tr( style=" "background-color:.+?"")?><td" )
             {    $Search  $Line  Select-String  -Pattern  '<td ?[a-z\-:;"=]*>(.*?)<\/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 " <tr style=" "background-color:(.+?)"">" )
                         {    $Line  $Line  -replace  "<tr style=""background-color:$($Matches[1])" , "<tr style=""background-color:$Color"
                         }
                         Else
                         {    $Line  $Line .Replace( "<tr>" , "<tr style=""background-color:$Color"">" )
                         }
                     }
                     Else
                     {    Write-Verbose  "$(Get-Date): Criteria met!  Changing cell to $Color..."
                         $Line  $Line .Replace( $Search .Matches[ $Index ].Value, "<td style=""background-color:$Color"">$Value</td>" )
                     }
                 }
             }
             Write-Output  $Line
         }
     }
     
     End  {
         Write-Verbose  "$(Get-Date): Function Set-CellColor completed"
     }
}
#加载Vsphere
function  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-PSSnapin
if ( $snapins .name  -eq  "VMware.VimAutomation.Core" )
{
     Write-Host  "Vsphere SnapIn is loaded"  -ForegroundColor Cyan
}
else {
     Load-PowerCLI
}
#绑定VCenter
Connect-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 " <H1> DataStore </H1> " -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


我收到的邮件效果


wKiom1mKpNexRLYAAAHHhOOGEME536.jpg


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


wKioL1mKpwuTi-p7AAEhEOccS8g997.jpg






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1954755,如需转载请自行联系原作者

目录
相关文章
|
Web App开发 前端开发 BI
|
2月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
69 0
|
3月前
|
Windows
Powershell 重新排列去重 Windows环境变量
【9月更文挑战第13天】本文介绍如何使用PowerShell对Windows环境变量进行重新排列和去重。首先通过`$env:`访问环境变量,接着使用`-split`命令分割路径,再利用`Select-Object -Unique`去除重复项。之后可根据需要对路径进行排序,最后将处理后的路径组合并更新环境变量。注意修改环境变量前应备份重要数据并了解潜在影响。
137 10
|
7月前
|
存储 Ubuntu Linux
windows可以安装Ubuntu,ubuntu上也可以安装Powershell
powerhsell除了可以在windows上使用外,还可以在Ubuntu上部署开发环境。下面介绍Ubuntu上安装powershell的方法。
214 0
|
Shell Linux 开发工具
windows中cmd和PowerShell批处理命令
之前在 Git 批量删除本地分支,有用到 Linux 或 MacOS 下的批处理命令,这个命令中的 grep、xargs 本身是 Shell script,在 windows 中的 cmd 和 PowerShell 中是不能用的
111 0
|
JavaScript Windows
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
|
Windows
使用PowerShell获取Windows当前锁屏壁纸
使用PowerShell获取Windows当前锁屏壁纸 如果原始图片丢了,用这段代码就可以提取当前锁屏壁纸了!
188 0
|
应用服务中间件 nginx Windows
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
Windows PowerShell 中启动 Nginx 报错解决方案
|
XML 监控 数据格式
利用powershell进行windows日志分析
0x00 前言   Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦;另一个是Get-EventLog,使得起来相当简单,可以实时筛选,接下来,我们利用PowerShell 来自动筛选 Windows 事件日志。
2534 0