VMtools异常检测发邮件通知
测试环境:
vSphere环境,或VMware Workstation 环境。
虚拟环境内有 “xp1”,”xp3” 两台XP类型主机,xp1状态为开机时的高级选项菜单,
XP3 在蓝屏状态,
先用 cmd /c start /min ntsd -c q -pn winlogon.exe 1>nul 2>nul 让其中一台XP 蓝屏。
另一台不安装 tools.
只是 提示,可以通过打印 看出有问题的主机。
如果要 发邮件提醒 管理员,可以 调用sendMail.py脚本,调用参数如下。
可以把邮件内容,换成要发送的内容。
发送 邮件结果
$TextUtf8 = New-Object -typename System.Text.UTF8Encoding $EsxiHost = "192.168.16.130" $EsxiUser = "administrator@vsphere.local" $EsxiPassWd = "vCenterPassWd" #提醒或发送邮件时间间隔为 检查周期(次数) 乘以 检查时间 $G_TimeSeconds = 5 #多少秒检查一次为一周期 $G_ErrorTimes = 3 #多少周期 后发消息(邮件、短信)提醒管理员 $ConnIgnore = Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -confirm:$false $ConnectVIServer = Connect-VIServer -Server $EsxiHost -username $EsxiUser -Password $EsxiPassWd #创建一个存放问题主机的数组 $ErrorHostArr = New-Object -TypeName System.Collections.ArrayList #例如外主机 $ExceptErrorHostArr = "Except_VM_Name","" #错误主机类 class VMHost{ $Name $ErrorTimes = 1 $CreateTime [void] AddTime(){ $this.ErrorTimes++ $this.CreateTime =Get-Date -Format 'yyyy-MM-dd HH:mm:ss' } } function ErrorAddByName($vmName) { $ErrorHostArr | foreach{ if ($_.Name -eq $vmName) { $_.ErrorTimes ++ $_.CreateTime =Get-Date -Format 'yyyy-MM-dd HH:mm:ss' } } } function ExistErrHostByName($vmName) { [bool]$Result=$False foreach ($t in $ErrorHostArr) { if ($t.Name -eq $vmName) { $Result = $True Break } } return $Result } function IsExcept($vmName) { [bool]$Result=$False foreach ($n in $ExceptErrorHostArr) { if ($n -eq $vmName) { $Result = $True Break } } return $Result } while(1 -eq 1){ $ErrorHosts = get-vm | where {$_.PowerState -eq "PoweredOn" -and $_.extensiondata.guest.ToolsStatus -ne "toolsOk"} if($ErrorHosts.count -gt 0){ foreach ($t in $ErrorHosts) { if (IsExcept($t.Name)) { Continue } $IsExist = ExistErrHostByName($t.Name) if($IsExist){ ErrorAddByName($t.Name) }else { $AddErrHost = $ErrorHostArr.Add((new-object VMHost -Property @{'Name'=$t.Name;'CreateTime'=Get-Date -Format 'yyyy-MM-dd HH:mm:ss'})) } } } cls $SendErrorHostArr = New-Object -TypeName System.Collections.ArrayList Write-Host "有问题虚拟机名称" " 检测周期" " 时间" $ErrorHostArr | foreach{ if($_.ErrorTimes -gt $G_ErrorTimes){ $temp = $SendErrorHostArr.Add(($_.Name)) $_.ErrorTimes = 0 } Write-Host $_.Name " " $_.ErrorTimes" " $_.CreateTime } $SendMsg = "" foreach ($t in $SendErrorHostArr) { $SendMsg = $SendMsg + $t +"," } if($SendMsg -ne "" ){ $msg=$SendMsg.Substring(0,$SendMsg.Length-1) Write-Host "" $title = @" 发送邮件 故障主机: "@ #打印问题主机 Write-Host $title $msg #发送邮件给问题主机 #python .\sendMail.py "-Utest@163.com" "-Ppassword" "-Dsmtp.163.com" "-R['jieshou1@gmail.com','jieshou2@hotmail.com']" "-C'cahosong1@qq.com'" "-S'misong@21cn.com'" "-T$title" "-B$msg" } Start-Sleep -Seconds $G_TimeSeconds }
# coding: utf-8 import sys import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders from smtplib import SMTP from email.header import Header def getParsStr(_str): return _str[2:len(_str)] def sendMail(_argv): smtp = smtplib.SMTP() userName="" passWd="" hostDomain="" #smtp.163.com jieShouZhe =list() chaoSongzhe =list() miSongzhe =list() title = "" fuJian = "" #写入附件的绝对路径 zhengWen = "" for i in range(1, len(_argv)): if _argv[i].startswith('-U'): userName = getParsStr(_argv[i]) if _argv[i].startswith('-P'): passWd = getParsStr(_argv[i]) if _argv[i].startswith('-D'): hostDomain = getParsStr(_argv[i]) if _argv[i].startswith('-R'): jieShouZhe= getParsStr(_argv[i]) if len(jieShouZhe) >0: jieShouZhe = jieShouZhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",") if _argv[i].startswith('-C'): chaoSongzhe = getParsStr(_argv[i]) if len(chaoSongzhe) >0: chaoSongzhe= chaoSongzhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",") if _argv[i].startswith('-S'): miSongzhe = getParsStr(_argv[i]) if len(miSongzhe) >0: miSongzhe= miSongzhe.replace("\"","").replace("\'","").replace("[","").replace("]","").split(",") if _argv[i].startswith('-T'): title = getParsStr(_argv[i]) if _argv[i].startswith('-F'): fuJian = getParsStr(_argv[i]) if _argv[i].startswith('-B'): zhengWen = getParsStr(_argv[i]) email_client = smtplib.SMTP(hostDomain,25) #远程主机拒接连接 请使用smtplib.SMTP_SSL() email_client.login(userName, passWd) msg = MIMEText(zhengWen, 'plain', 'utf-8') msg['Subject'] = Header(title, 'utf-8') msg['From'] = userName msg['To'] = ','.join(jieShouZhe) msg['Cc'] = ','.join(chaoSongzhe) msg['Bcc'] =','.join(miSongzhe) email_client.sendmail(userName,jieShouZhe+chaoSongzhe+miSongzhe+[userName],msg.as_string()) email_client.quit() def getHelp(_argv): if len(_argv)<=1: print(""" *** 注意 所有参数不可出现空格 *** -U 发件者邮箱用户名 eg.463259624@qq.com -P 发件者邮箱密码 -D 发件者邮箱服务器 eg.smtp.163.com -R 接收者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com'] -C 抄送者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com'] -S 密送者邮箱,可设置多个格式为['xx@xx.com','yy@yy.com'] -T 邮件标题 -F 附件绝对路径 eg.d:\\test.txt ,(未实现) -B 邮件内容 实例: 1). sendMail.py -Utest@test.com -Pmima -Dsmtp.163.com -R'ShouJianZhe@test.com' -T标题 -B邮件内容 2). sendMail.py -Utest@test.com -Pmima -Dsmtp.163.com -R['ShouJianZhe1@test.com','ShouJianZhe2@test.com'] -C'ChaoSongzhe@test.com' -S['MiSongzhe@test.com'] -T标题 -B邮件内容 """) if __name__ == '__main__': if len(sys.argv)<=1: getHelp(sys.argv) else: sendMail(sys.argv)