yum -y install net-snmp net-snmp-agent-libs net-snmp-devel net-snmp-libs net-snmp-perl net-snmp-utils
注:使用perl脚本解析trap信息并进行格式化,net-snmp-perl
vi /usr/local/zabbix_proxy/etc/zabbix_proxy.conf
SNMPTrapperFile=/tmp/zabbix_traps.tmp #数据从snmp trap守护进程传到服务器的临时文件,必须与zabbix_trap_receiver.pl或者SNMPTT配置文件中一致
StartSNMPTrapper=1 #1代表启用,0为禁用
systemctl restart zabbix_proxy
cp /usr/local/zabbix-6.0.19/misc/snmptrap/zabbix_trap_receiver.pl /usr/bin/zabbix_trap_receiver.pl
vi /etc/snmp/snmptrapd.conf
# Example configuration file for snmptrapd
#
# No traps are handled by default, you must edit this file!
#
authCommunity log,execute,net public #只接收团体字为public的trap信息
# 不做任何验证 disableAuthorization yes
# traphandle SNMPv2-MIB::coldStart /usr/bin/bin/my_great_script cold
perl do "/usr/bin/zabbix_trap_receiver.pl"
grep -w '$SNMPTrapperFile' /usr/bin/zabbix_trap_receiver.pl
注意:Zabbix不提供任何日志轮询系统(它应由用户处理)。trapfile文件需要设置日志切割, 日志轮询应该首先重命名旧文件,然后才能将其删除,以免丢失trap:
net-snmp-config --default-mibdirs
#输出 /root/.snmp/mibs:/usr/share/snmp/mibs
将第三方mib放入目录/usr/share/snmp/mibs,用于perl脚本或SNMPTT解析OID信息。
(vSphere的mib库下载地址:https://customerconnect.vmware.com/cn/downloads/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/7_0#drivers_tools“VMware vSphere Management Information Base”部分)
systemctl start snmptrapd.service
snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.4' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.4 s "testMonitor03"
如在指定的trap存放文件中接收到对应解析信息即正常,本案例中为“/tmp/zabbix_traps.tmp”
注:如不正常,检查配置文件以及net-snmp-perl是否安装成功,若重新安装后需重启snmptrap服务再进行测试。
tar xf snmptt_1.5.tgz
cd snmptt_1.5
#将snmptt自带相关命令拷贝到/usr/sbin下
cp snmptt /usr/sbin/ && chmod +x /usr/sbin/snmptt
cp snmptthandler /usr/sbin/ && chmod +x /usr/sbin/snmptthandler
cp snmpttconvertmib /usr/sbin/ && chmod +x /usr/sbin/snmpttconvertmib
cp snmpttconvert /usr/sbin/ && chmod +x /usr/sbin/snmpttconvert
#拷贝snmptt配置文件snmptt.ini和snmptt.conf解析规则文件到放/etc/snmp下
cp snmptt.ini /etc/snmp/
cp examples/snmptt.conf.generic /etc/snmp/snmptt.conf
cp snmptt.service /usr/lib/systemd/system
#允许使用NET-SNMP包中的Perl模块:
net_snmp_perl_enable = 1
#将日志记录到trap文件中,该文件将被Zabbix读取
log_enable = 1
log_file = [TRAP FILE]
#设置日期-时间格式
date_time_format = %H:%M:%S %Y/%m/%d
traphandle default snmptthandle
#注释原来的perl方式,修改为snmptt方式
注:使用--daemon命令行选项运行SNMPTT或将snmptt.ini文件中的模式变量设置为守护进程将导致SNMPTT在守护进程模式下运行
或者在使用嵌入式处理程序时,需要用
perl do "/usr/sbin/snmptthandler-embedded"
注意:使用嵌入式处理程序时会获得更好的性能
traphandle default /usr/sbin/snmptt
注:snmptt.conf文件越大,处理时间就越长。如果会收到大量TRAP,则应使用守护进程模式。在没有--daemon命令行选项的情况下运行SNMPTT将导致独立模式,除非snmptt.ini文件中的模式变量设置为守护进程。对于独立模式,snmptt.ini文件中的模式变量应设置为独立模式。
# 1、匹配Linkdown的规则,注意index设置为*匹配所有端口
EVENT LinkDown .1.3.6.1.6.3.1.1.5.3.* "Status Events" Warning
FORMAT ZBXTRAP $aA LinkDown on interface $4. Admin state: $2. Operational state: $3.
# 2、匹配Linkup的规则,注意index设置为*匹配所有端口
EVENT LinkUp .1.3.6.1.6.3.1.1.5.4.* "Status Events" Normal
FORMAT ZBXTRAP $aA LinkUp on interface $4. Admin state: $2. Operational state: $3.
# 3、vSphere警报,oid设置为.* 所有trap信息都按此规则处理
EVENT General .* "General event" Warning
FORMAT ZBXTRAP vCenter发送地址:$aA $Fn告警ESXI地址:$5 $Fn警报详情:$4
NODES 10.0.xxx.xxx (注:vcenterIP地址)
# 4、默认规则,oid设置为.* 没有其他规则匹配到时,所有trap信息都按此规则处理
EVENT General .* "General event" Warning
FORMAT ZBXTRAP trap代理主机名:$A trap代理IP:$aA Trap主机名:$R IP地址:$aR 类别:$c 严重性:$s InFo:$1 --- $2 --- $3 --- $4 --- $5 --- $6 --- $7 --- $8
systemctl restart snmptrapd
systemctl start snmptt
1、
需要安装perl-Config-IniFiles,如果yum源找不到软件包,可以下载源码包再用yum local install perl-Config-IniFiles-2.79-1.el7.noarch.rpm解决依赖关系
2、
如上需要安装perl-Sys-Syslog
snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring001" .1.3.6.1.6.3.1.1.5.3 s "Down" .1.3.6.1.6.3.1.1.5.3 s "UP" .1.3.6.1.6.3.1.1.5.3 s "Interface-32"
主机接口需要与发送trap信息设备的IP一致
snmptrap信息特殊性一般需要手动设置恢复表达式,另外可能一条信息包含多个接口的状态,所以事件生成要选择“多重”,事件关闭要设置为“匹配标签”使告警不会被误关闭。
snmptt.conf定义了解析规则,自己单独为OID创建解析规则太过繁琐。
nmpttconvertmib -in=path-to-mib -out=/tmp/snmptt.conf --net_snmp_perl
# 将path-to-mib文件自动解析并将转换结果追加到snmptt.conf文件中
#由于snmpttconvertmib不支持批量转换,可能需要通过脚本来进行批量转换:
for f in $(grep -l -i "notification" ./*);do snmpttconvertmib -in="$f" -out=/tmp/snmptt.conf --net_snmp_perl;done;
#目的使用循环读取不同MIB文件,将所有文件内容包含"notification"的mib文件解析转换,转换后的结果导入到指定一个或者多个文件中。TRAP-TYPE (v1) or NOTIFICATION-TYPE
sed -r -i "s/^(FORMAT)/\1 ZBXTRAP \$aA/g" /tmp/snmptt.conf
grep "FORMAT" /tmp/snmptt.conf #检查修改结果
vi /etc/snmptt/snmptt.ini
###
snmptt_conf_files = <
systemctl restart snmptt
注意:conf文件中的解析规则不要重复,否则同一个snmptrap事件会匹配多个规则,并生成多条事件。
例如:IP地址自动转换,HEX->IP地址;利用snmpget命令获取trap的描述信息;执行自愈脚本等
案例:通过SNMPTT中”EXEC”属性,自定义外部python脚本,将vsphere虚拟化的SNMPTRAP信息hexstring格式进行转码翻译后,再将翻译后的消息写回到SNMPTrapperFile定义的文件中,实现告警事件接入ZABBIX并提升SNMPTRAP信息可读性。
# -*- coding: utf-8 -*-
# 用于将vsphere snmptrap告警事件hex string格式转换为可读的字符串格式,然后再记录到snmptrap文件中供zabbix监控
import struct
import sys
import time
logtime=time.strftime('%H:%M:%S %Y/%m/%d',time.localtime())
trapfile = "/var/log/snmptrap/zabbix_traps.tmp"
hex_string = sys.argv[1]
vcenter_ip = sys.argv[2]
esxi_ip = sys.argv[3]
# 将hex字符串转换成utf-8字符串
byte_message = struct.pack('B'*len(hex_string.split()), *[int(hex_string.split()[i], 16) for i in range(len(hex_string.split()))])
# 在python2中可以直接输出为字符串,但在python3中输出为byte字节串格式 还需要再解码
utf8_message = byte_message.decode('utf-8')
# 将信息追加到trapfile文件
zbxtrap_message = f'''
{logtime} ZBXTRAP {esxi_ip} have a warning!
告警类别:vSphere 虚拟化告警
告警事件:{utf8_message}
告警时间:{logtime}
ESXI主机地址:{esxi_ip}
vCenter地址:{vcenter_ip}
'''
with open(trapfile,'a+') as f:
f.write(zbxtrap_message)
f.write("\n")
f.close()
#print zbxtrap_message
注意:此时FORMAT行不再添加ZBXTRAP关键字,由脚本添加关键字并直接写入解析后的信息到trapfile。
vim /etc/snmp/snmptt.conf
EVENT General .* "General event" Warning
FORMAT vCenter发送地址:$aA 告警ESXI地址:$5 警报详情:$4
EXEC python /etc/snmptt/vsphere_snmptrap.py $4 $aA $5
NODES 10.0.xxx.xxx (注:vcenter IP)
systemctl restart snmptt
详情参看官网:SNMPTT
EVENT event_name event_OID "category" severity
FORMAT format_string
[EXEC command_string]
[NODES sources_list]
[MATCH [MODE=[or | and]] | [$n:[!][( ) | n | n-n | > n]
[SDESC]
[EDESC]
$A -陷阱代理主机名(见注1)
$aA - Trap代理IP地址
$Be - securityEngineID (snmpEngineID)(见注7)
$Bu - securityName (snmpCommunitySecurityName)(见注7)
$BE - contextEngineID (snmpCommunityContextEngineID)(见注释7)
$Bn - contextName (snmpCommunityContextName)(见注7)
$c -类别
$C - Trap社区字符串
$D -来自snmpt . conf或MIB文件的描述文本(见注释6)
$E -符号格式的企业陷阱OID
$e -数字格式的企业trap OID (.1.3.6.1.4.1.n)
$j -企业编号(n)
$Fa -报警(铃)(BEL)
$Ff -形式馈入(Ff)
$Fn -换行符(LF, NL)
$Fr -回报(CR)
$Ft - tab (HT, tab)
$Fz -翻译格式行(仅限EXEC, log_format和syslog_format)
$G -一般陷阱编号(如果是企业陷阱则为0)
$S -特定trap编号(如果是一般trap则为0)
$H -运行SNMPTT的系统主机名
$N -匹配条目的.conf文件中定义的事件名称
$i -匹配条目的.conf文件中定义的事件OID(可以是通配符OID)
$O -符号格式的Trap OID(见注4)
$0 -数字格式的Trap OID(见注4)
$pn - PREEXEC结果n (1-n)
$pun -未知陷阱预执行结果n (1-n)。请参见snmp .ini中的unknown_trap_preexec设置。
$R, $R - Trap主机名(参见注1)
$aR, $aR - IP地址
$s -严重性
$T - Uptime:网络实体初始化后的时间
$X -时间陷阱被假脱机(守护模式)或当前时间(独立模式)
$x -日期陷阱被假脱机(守护模式)或当前日期(独立模式)
$# -陷阱中变量绑定的数目(多少)
$$ -打印$
$@ -从陷阱被假脱机(守护模式)或当前时间(独立模式)开始的秒数
$n -扩展变量绑定n (1-n)(参见注释2,5)
$+n -将变量绑定n (1-n)展开为变量名:值的格式(参见注2、3、5)
$-n -展开变量绑定n (1-n),格式为变量名(变量类型):值(见注2、3、5)
$vn -扩展变量绑定n的变量名(1-n)(参见注3)
$* -扩展所有变量绑定(参见注5)
$+* -以变量名:值的格式展开所有变量绑定(参见注2、3、5)
$-* -以变量名(变量类型):值的格式展开所有变量绑定(参见注2、3、5)
例如:FORMAT NIC switchover to slot $3, port $4 from slot $5, port $6
例如:
EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
FORMAT NIC switchover to slot $3, port $4 from slot $5, port $6
EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - $Fz"
EXEC c:\\snmp\\pager netops "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
如果在“snmptt.conf”文件中设置trap severity为LOGONLY,则不会执行EXEC。
注意:与FORMAT行不同的是,消息中没有附加任何内容。如果您想在上面的页面中包含主机名和日期,则必须使用诸如$r、$x和$x之类的变量。
例如:
EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT Link down on interface $1($p1). Admin state: $2. Operational state: $3
PREEXEC /usr/local/bin/snmpget -v 1 -Ovq -c public $aA ifDescr.$1
样例输出:Link down on interface 69("100BaseTX Port 1/6 Name SERVER1"). Admin state up. Operational state: down
在上面的示例中,结果是用引号括起来的,因为这是从snmpget返回的结果(它不是由SNMPTT添加的)。
注意:即使在snmptt.conf文件中设置trap severity为LOGONLY, PREEXEC也会执行。
例如:
NODES 192.168.1.0/24
NODES 192.168.1.0/24 2001:db8:a::/64
注意:有两种操作模式:POS(正-默认)和NEG(负)。如果设置为POS,则如果任何NODES条目匹配,则NODES是“匹配”。如果设置为NEG,那么只有当NODES条目都不匹配时,NODES才是“匹配”。要更改操作模式,请使用以下语句之一:
NODES MODE=POS
NODES MODE=NEG
例如匹配任何不称为fred、barney、betty或wilma的主机:
NODES fred barney betty wilma
NODES MODE=NEG
1、i - 匹配时忽略大小写
2、命令格式可用:
MATCH MODE=[or | and]
MATCH $x: [!] (reg) [i]
MATCH $x: [!] n
MATCH $x: [!] n-n
MATCH $x: [!] < n
MATCH $x: [!] > n
MATCH $x: [!] & n
MATCH $x: [!] x.x.x.x
MATCH $x: [!] x.x.x.x-x.x.x.x
MATCH $x: [!] x.x.x.x/x
MATCH $x: [!] x:x:x
MATCH $x: [!] x:x:x/x
注:
or 或 and 为多个条件时的默认匹配模式
$x 是任何变量(例如:$3、$A、$*等)
reg 是一个正则表达式
!用于否定结果,代表not不是
& 相当于AND,代表和
n是一个数字
x.x.x.x 是一个IP地址
x.x.x.x.x-x.x.x.x 是IPv4网络地址范围
x.x.x.x.x/x 是一个IPv4 CIDR网络地址
x:x:x 是一个IPv6地址
x:x:x/x 是一个IPv6 CIDR网络地址
例如:
MATCH $2: 1000-2000
MATCH $3: 52
MATCH $4: 192.168.1.10-192.168.1.20
MATCH $s: (Major)
MATCH $3: >20
MATCH $5: !(alarm|critical)
MATCH $6: (\(1\) remaining)
MATCH $7: (power)i
MATCH MODE=and
i - 尝试匹配左侧时忽略大小写
g - 替换所有出现,而不是只替换第一个
e - 执行右侧(eval)作为代码
例如:
FORMAT行格式化之前:UPS has detected a building alarm. Cause: UPS1 Alarm #14: Building alarm 3.
REGEX (Building alarm 3)(Computer room high temperature)
REGEX (Building alarm 4)(Moisture detection alarm)
REGEX (roOm)(ROOM)ig
REGEX (UPS)(The big UPS)
REGEX (\s+)( )g
格式化之后:The big UPS has detected a building alarm. Cause: UPS1 Alarm #14: Computer ROOM high temperature.
注意:要在搜索表达式中使用括号(or),它们必须反斜杠(\),否则它被解释为捕获(见下文)。替换文本不需要反斜杠。
例如:
FORMAT行格式化之前:FORMAT line before: Alarm (1) and (2) has been triggered
REGEX (\(1\))(One)
REGEX (\(2\))((Two))
格式化之后:FORMAT line after: Alarm One and (Two) has been triggered
注意:如果启用了allow_unsafe_regex,则可以在替换文本中使用捕获。
例如:
FORMAT行格式化之前:The system has logged exception error 55 for the service testservice
REGEX (The system has logged exception error (\d+) for the service (\w+))(Service $2 generated error $1)
格式化之后:Service testservice generated error 55
注意:如果启用了allow_unsafe_regex并指定了e修饰符,则执行右侧(evaluated)。这允许您使用Perl函数执行各种任务,例如从十六进制转换为十进制,使用sprintf格式化文本等。所有文本必须位于引号内,并且语句可以使用点(.)串联在一起。
例如:
FORMAT行格式化之前:FORMAT line before: Authentication Failure Trap from IP address: C0 A8 1 FE
REGEX (Address: (\w+)\s+(\w+)\s+(\w+)\s+(\w+))("address: ".hex($1).".".hex($2).".".hex($3).".".hex($4))ei
格式化之后:FORMAT line after: Authentication Failure Trap from IP address: 192.168.1.254
描述的可选开头。此行和行EDESC之间的所有文本将被SNMPTT忽略。此部分可用于输入有关陷阱的注释,供您自己使用。如果您使用SDSC,则必须遵循EDESC。
用于结束描述部分。