脚本目的:
需要对华为ac中的ssid流量进行监控,但ac web页面中与snmp取值差异很大。
正好ac的用户流量配置了本地转发,用户vlan的网关在一台交换机上。交换机可以配置vlan statistic以统计vlan内的流量。
但vlan流量统计后,没有对应的snmp oid,考虑使用python脚本来进行取值。
在zabbix server中定义一个脚本,并增加可执行权限
#!/usr/bin/python3
import paramiko
import time
# Connect information:
ip = '172.16.*.*'
username = 'user'
password = 'Password'
# Create SSH client:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Connect device:
client.connect(hostname=ip, username=username, password=password)
time.sleep(0.5)
# Execute command:
command=client.invoke_shell(width=300)
output = ''
for vlan in [1006,1800]:
command.send('\n')
command.send(f'dis vlan {vlan} statistics\n')
time.sleep(2)
command.send('q\n')
output=command.recv(65535).decode('utf-8')
# Shutdown ssh connection
client.close()
print(output)
使用agent调用:
修改 /etc/zabbix/zabbix_agentd.conf
# Default:
# Timeout=3 默认超时时间太短,需要延长为30秒:
Timeout=30
# 自定义脚本对应的键值,需要唯一。逗号之后是脚本的路径:
UserParameter=py.network.vlan.traffic,/data/zabbix_compose/externalscripts/hwSsidTraffic.py
# 测试脚本的运行,返回值是一个列表:
$ zabbix_agentd -t py.network.vlan.traffic
py.network.vlan.traffic [t|
Info: The max number of VTY users is 10, and the number
……omit
# 需要重启zabbix-agent以重新加载用户自定义参数,官方提供的zabbix_agentd -R命令执行不成功
在zabbix web中新建监控项
【直接在zabbix snmp设备中调用此键值不成功,测试在zabbix agent所在的服务器调用,是可以的】:
注意:在调用前,zabbix server的Timeout也需要增加。
对数据进行预处理:
# value返回的文本大概这样:
…omit…
VLAN : 1006
---------------------------------------------------------------------------------
Item Packets Bytes
pps bps
---------------------------------------------------------------------------------
Inbound 234,949,790 92,944,972,527
10,456 29,035,080
Outbound 359,318,367 297,770,911,350
18,965 173,139,000
…omit…
#在预处理中的javascript脚本:
// 删除所获取文本的前4行【登录提示等无用数据】:
text = value.split('\n').slice(4).join('\n');
// 替换所有的',':
text = text.replace(/,/g, "");
// 输出处理过的数值:
return text;
提取需要的数据
因为要监控的数值有多个,需要增加依赖项目【zabbix 6.4新增功能】来对数值分别处理【键值自定义】:
预处理用的javascript脚本,其它监控项的脚本中需要修改vlan id和Inbound/outbound来提取收发流量:
// 使用正则对获取到的值进行处理, 匹配VLAN 1006前的瞬时数值, 即Outbound之后的第4段数字(瞬时发送流量):
text = value.match(/VLAN : 1800[\s\S]*?Outbound\s+\d+\s+\d+[\s\S]*?\d+\s+(\d+)[\s\S]*?: 1800/)[1];
return text;
最后增加一个图形来进行展示:
参考:https://www.zabbix.com/documentation/6.0/zh/manual/config/items/userparameters/extending_agent
标签:自定义,text,vlan,agent,zabbix,client,command,监控 From: https://www.cnblogs.com/feifei6779/p/17329058.html