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 程序启动顺序

  1. list_socket.py
  2. 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()

 

效果图

 

 

posted @ 2024-08-10 17:08  飞翔的小胖猪  阅读(112)  评论(0编辑  收藏  举报