python3使用pyVmomi获取vCenter中告警信息语音告警
一、说明
文章分享在pyVmomi获取vCenter中的告警信息,对red级别的告警信息进行本地语音告警,记录告警信息到本地txt文件后清空当前vCenter上的告警信息。
1.1 文件描述
list_socket.py:python3脚本文件,通过socket模块实现实时监听来自外部的网络数据;通过pyttsx3模块实现文字转为为语音并播放。
alarm_vcenter.py:python3脚本文件,通过pyVim模块实现采集vCenter告警、清除vCenter当前告警;通过socket模块推送整合过后的告警信息至接收端;open内置函数在vCenter告警清除前保留red告警至本地txt文件。
alert_log.txt:文本文件,保存vCenter红色告警信息,文件存在云alarm_vcenter.py同级目录中,如果本地没有这个文件程序会自动创建。
1.2 程序启动顺序
- list_socket.py
- alarm_vcenter.py
1.3 网络拓扑图
1.4 函数工作流
二、Python脚本
2.1 list_socket.py
import socket import pyttsx3 # 初始化tts引擎 engine = pyttsx3.init() def realtime_data_receiver(host, port): try: # 创建 socket 对象 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 绑定端口 s.bind((host, port)) # 设置最大连接数 s.listen(1) print(f"Listening for connections on {host}:{port}...") while True: # 接受一个新的连接 conn, addr = s.accept() print(f"Connected by {addr[0]}:{addr[1]}") # 无限循环以接收数据 while True: data = conn.recv(1024) # 接收数据,bufsize 为 1024 字节 if not data: break # 处理数据进行语音播报 # 设置要转换的文本 text = str(data.decode()) # 转换文本为语音 engine.say(text) # 播放语音 engine.runAndWait() # 关闭连接 conn.close() except Exception as e: print("Listening faile: ", str(e)) #定义主函数 def main(): host = '0.0.0.0' # 监听的主机地址 port = 5000 # 监听的端口 realtime_data_receiver(host, port) #调用主函数 if __name__ == "__main__": main()
效果图
2.2 alarm_vcenter.py
import ssl import datetime from pyVmomi import vim from pyVim.connect import SmartConnect, Disconnect from pyVmomi import vmodl import socket import datetime #定义发送tcp信息函数 def send_tcp_data(ip, port, data): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) sock.send(data.encode()) sock.close() except Exception as e: print("sent alarm info faile: ",str(e)) # 连接vCneter函数 def connect_to_vcenter(hostname,username,password): try: #忽略ssl证书验证 ssl._create_default_https_context = ssl._create_unverified_context #连接到vCenter service_instance = SmartConnect(host=hostname, user=username, pwd=password) return service_instance except Exception as e: print("connect vCenter faile: ",str(e)) # 获取vCenter告警函数,清空所有的告警,并记录告警信息至本地alert_log.txt文件 def get_vCenter_alarm_info(service_instance,host_ip,host_port,current_time_t): try: #获取vcenter告警 contents = service_instance.RetrieveContent() Alarmcontents= contents.rootFolder.triggeredAlarmState #输出共计多少个告警,可注释 print(f"当前vc告警总数: {len(Alarmcontents)},告警已经自动确认请检查") send_alarm_sum = f"当前vc告警总数: {len(Alarmcontents)},告警已经自动确认请检查" send_tcp_data(host_ip, host_port, send_alarm_sum) #获取vc中定义的告警清单信息 alarmcontents = contents.alarmManager.GetAlarm() tt = vim.alarm.AlarmFilterSpec() print("**" * 60) #输出数据分割线 for targer in Alarmcontents: dd = targer.entity #清除摘要信息页告警提示和所有问题,清除不了“已触发的警报”。 contents.alarmManager.AcknowledgeAlarm(targer.alarm,entity=dd) #设置红色的告警才进行语音提示 if str(dd.overallStatus) == 'red' : #print(f"实体类型: {type(targer.alarm)}") #print(f"宿主机IP地址: {dd.name}") #print(f"告警等级: {dd.overallStatus}") #print(f"告警类别:{targer.alarm}") #print(f"数据类别:{type(targer.alarm)}") for alarminfo in alarmcontents: if targer.alarm == alarminfo.info.alarm : send_alarm_data = f"重要告警:告警主体 {dd.name } 告警信息: {alarminfo.info.name}" # 调用函数发送tcp信息至接收端示例 print(send_alarm_data) #写入告警信息至本地txt文件 with open('alert_log.txt', "a") as file: file.write(f"{current_time_t} : {send_alarm_data}\n") # 将追加内容写入文件 file.close() send_tcp_data(host_ip, host_port, send_alarm_data) #清除已触发告警 contents.alarmManager.ClearTriggeredAlarms(filter=tt) # 分割线 print("##" * 60) # 断开vc连接 Disconnect(service_instance) except Exception as e: Disconnect(service_instance) print("get vCenter alarm info faile: ", str(e)) #定义主函数 def main(): #定义vc登录信息 vcenter_ip = '192.168.10.222' vcenter_user = 'administrator@vsphere.local' vcenter_password = 'Tyroot!#123' #定义告警接收端信息 post_host_ip='192.168.10.1' post_host_port=5000 #获取当前时间 current_time = datetime.datetime.now() #调用功能函数 vc_instance = connect_to_vcenter(vcenter_ip,vcenter_user,vcenter_password) get_vCenter_alarm_info(vc_instance,post_host_ip,post_host_port,current_time) #调用主函数 if __name__ == "__main__": main()
效果图