Flask接口签名sign原理与实例代码浅析
798
2022-09-09
Zabbix监控- Aruba AP运行数据(非MM架构)
基本情况
本文档中AP运行数据指: AP每Radio连接数量和总连接数量,Channel使用率。
早期是通过shell来实现数据获取,然后trapper到zabbix server.但是有个明显缺点: AP的名称不是LLD实现的,也就是说近百个AP都是人工手动创建的监控主机。
为了解决这个问题,将代码使用Python进行了重写。
概念&难点
在控制器中,每项数据都会有自己的OID,我们要将这些OID和AP关联起来,毕竟预期Zabbix中显示的是每个AP的相关信息。
Radio: 射频。双频AP有Radio0和Radio1。 Aruba对应的索引编号分别是 2和1(CISCO有差异). Channel: 信道。 启用双频后,通常使用两个信道(当然也可以捆绑多个)。 Aruba对应的索引编号同样分别是2和1。 Radio0 : SnmpWalk值为0是2.4G,值为1时为5G,表示启用了双5G。值位2时,未发射射频。 Radio1: 值为1时指5G;值为2时,未发射射频。不能为0. Radio0: 值为1时,SnmpWalk获取到的终端数并不是实际的数量,需要除以2. 值为0时,为实际终端数量。所以计算时,需要注意。 未射频的AP需要单独排除,否则SnmpWalk射频和信道会报错。
基本过程
获取AP名字Trapper到Zabbix Server.
1.zabbix创建LLD模板
创建监控项:
2.Python获取AP名字trapper到Zabbix.
push_ap.py :
#!/usr/bin/env python #-*- coding:UTF-8 -*- import os import json ap_json = {"data": []} ap_sets = os.popen("snmpwalk -v 2c -c mm the IP_Aruba_AC .1.3.6.1.4.1.14823.2.2.1.5.2.1.4 | grep -i ap | awk -F ':' '{print $4}'|awk -F '\"' '{print $2}'") ap_list = ap_sets.read().splitlines() ap_sets.close() for ap in ap_list: ap_json["data"].append({"{#AP_NAME}": ap}) push_data = json.dumps(ap_json) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -p 10051 -s office-aruba-bj-t2-11-ac-10 -k ap.discovery -o '%s'" %push_data)
获取AP运行数据Trapper到Zabbix.
push_data_of_ap.py:
#!/usr/bin/env python #-*- coding:utf-8 -*- #------ push ap radio utilization and number of clients to zabbix----- import os prefix_ap_oid = '1.3.6.1.4.1.14823.2.2.1.5.2.1.4.1.3' prefix_radio_clients_oid = '1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.7' prefix_channel_oid = '1.3.6.1.4.1.14823.2.2.1.5.2.1.5.1.6' prefix_double5G_oid = '1.3.6.1.4.1.14823.2.2.1.5.2.1.4.1.48' prefix_ap_status_oid = '1.3.6.1.4.1.14823.2.2.1.5.2.1.4.1.10' ap_names_dict = {} # key存储AP名字,值存储AP索引 double_5G = [] #开启双5G的AP列表.开启双5G的AP,radio0客户端数量准确,radio1的客户端数量需要除以2. snmpwalk_ap_datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s" %prefix_ap_oid) #ap_disabled_list = ['AP-01', 'T2-F19-AP04', 'T1-F16-AP30'] ap_disabled_list = [] def get_ap_dic_fun(dict): #获取AP名字和索引字符串并别存入字典的key: value。 for ap_names in snmpwalk_ap_datas.readlines(): ap_name = ap_names.split('"')[1] ap_index = (ap_names.split('=')[0]).split('1.4.1.3')[1].rstrip() dict[ap_name] = ap_index return dict def trapper_ap_status(dict_ap): for ap_name in dict_ap.keys(): snmpwalk_status_datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s" % (prefix_ap_status_oid, dict_ap[ap_name])) ap_status = int(snmpwalk_status_datas.read().split(':')[-1]) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k status.[%s] -o %s" % (ap_name, ap_status)) def remove_disabled_ap(dict_ap): #判断AP状态,1为在线。不为1,则从字典中移除,并加入禁用ap列表。 for ap_name in dict_ap.keys(): snmpwalk_status_datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s" % (prefix_ap_status_oid, dict_ap[ap_name])) ap_status = int(snmpwalk_status_datas.read().split(':')[-1]) if ap_status != 1: dict_ap.pop(ap_name) ap_disabled_list.append(ap_name) def trapper_channel_util(dict_ap): #trapper 信道使用率 for ap_name in dict_ap.keys(): try: snmpwalk_ap_radio0 = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s.2" % (prefix_channel_oid, dict_ap[ap_name])) snmpwalk_ap_radio1 = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s.1" % (prefix_channel_oid, dict_ap[ap_name])) channel0_data_source = snmpwalk_ap_radio0.read() channel1_data_source = snmpwalk_ap_radio1.read() if ap_name != 'AP-01' and ap_name != 'T2-F19-AP04' and ap_name != 'T1-F16-AP30': radio0_util_percent = int(channel0_data_source.split(':')[-1]) radio1_util_percent = int(channel1_data_source.split(':')[-1]) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k uti_radio0.[%s] -o %s" %(ap_name, radio0_util_percent)) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k uti_radio1.[%s] -o %s" %(ap_name, radio1_util_percent)) except Exception as e: print e def check_double_5G(dict_ap): #判断AP是否开启双5G。1为开启,后续Radio0客户端数量除以2。 for ap_name in dict_ap.keys(): datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s" % (prefix_double5G_oid, dict_ap[ap_name])).read() value = int(datas.split(':')[-1]) if value == 1: #值为1,已启用双5G.值为0,未启用. double_5G.append(ap_name) def trapper_clients_ap(dict_ap): #trapper 每个射频客户端数量,并计算AP终端总数量。 for ap_name in dict_ap.keys(): radio0_datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s.2" % (prefix_radio_clients_oid, dict_ap[ap_name])).read() radio1_datas = os.popen("snmpwalk -v 2c -c mm IP_Aruba_AC %s%s.1" % (prefix_radio_clients_oid, dict_ap[ap_name])).read() clients_radio1 = int(radio1_datas.split(':')[-1]) if ap_name in double_5G: clients_radio0 = int(radio0_datas.split(':')[-1]) / 2 else: clients_radio0 = int(radio0_datas.split(':')[-1]) clients_sum = clients_radio0 + clients_radio1 os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k clients.radio0.[%s] -o %s" %(ap_name,clients_radio0)) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k clients.radio1.[%s] -o %s" %(ap_name,clients_radio1)) os.system("/bin/zabbix_sender -z Zabbix_Server_IP -vv -s office-aruba-bj-t2-11-ac-10 -k clients.[%s] -o %s" %(ap_name,clients_sum)) if __name__ == '__main__': get_ap_dic_fun(ap_names_dict) snmpwalk_ap_datas.close() trapper_ap_status(ap_names_dict) remove_disabled_ap(ap_names_dict) trapper_channel_util(ap_names_dict) check_double_5G(ap_names_dict) trapper_clients_ap(ap_names_dict)
效果展示
Zabbix控制台:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~