一、zabbix服务器安装snmptrapd服务
1、安装服务
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
2、zabbix启用snmptrap进程,重启服务
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
二、配置snmptrap接收设备trap信息
1、将zabbix源码包里的perl脚本复制到/usr/bin目录下
cp /usr/local/zabbix-6.0.19/misc/snmptrap/zabbix_trap_receiver.pl /usr/bin/zabbix_trap_receiver.pl
2、编辑snmptrap服务配置文件
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"
3、检查zabbix_trap_receiver.pl脚本中的“trap信息存放路径”配置是否与zabbix配置一致
grep -w '$SNMPTrapperFile' /usr/bin/zabbix_trap_receiver.pl
注意:Zabbix不提供任何日志轮询系统(它应由用户处理)。trapfile文件需要设置日志切割, 日志轮询应该首先重命名旧文件,然后才能将其删除,以免丢失trap:
4、查看第三方mib文件的存放目录
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”部分)
5、启动snmptrap服务
systemctl start snmptrapd.service
6、测试snmptrap接收以及perl脚本解析功能
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服务再进行测试。
SNMP TRAP监控过程
- 被监控设备向zabbix发送一个trap信息,由二进制snmptrapd进程接收它。
- snmptrapd进程执行perl脚本,该脚本将trap信息解析转换为适合Zabbix监控的格式(基本上添加标头)。
- 解析后,trap信息被保存到/tmp/zabbix_traps.tmp
- SNMP trapper检查文件是否有新的trap信息,并将其与监控主机匹配。
三、使用snmptt解析trap信息(第二种)
1、安装snmptt服务
-
1.1 官网下载二进制包 Download SNMP Trap Translator
http://www.net-snmp.org/download.html
SNMPTT
-
1.2 安装snmptt
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
2、编辑snmptt配置文件snmptt.ini
#允许使用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
3、修改snmptrap配置文件snmptrapd.conf
3.1、使用SNMPTT守护进程模式
traphandle default snmptthandle
#注释原来的perl方式,修改为snmptt方式
注:使用--daemon命令行选项运行SNMPTT或将snmptt.ini文件中的模式变量设置为守护进程将导致SNMPTT在守护进程模式下运行
或者在使用嵌入式处理程序时,需要用
perl do "/usr/sbin/snmptthandler-embedded"
注意:使用嵌入式处理程序时会获得更好的性能
3.2、使用SNMPTT独立模式
traphandle default /usr/sbin/snmptt
注:snmptt.conf文件越大,处理时间就越长。如果会收到大量TRAP,则应使用守护进程模式。在没有--daemon命令行选项的情况下运行SNMPTT将导致独立模式,除非snmptt.ini文件中的模式变量设置为守护进程。对于独立模式,snmptt.ini文件中的模式变量应设置为独立模式。
4、snmptt.conf添加snmptt解析规则
# 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、默认规则,oid设置为.* 没有其他规则匹配到时,所有trap信息都按此规则处理
EVENT General .* "General event" Normal
FORMAT ZBXTRAP $aA $1
5、重启snmptrapd与snmptt服务
systemctl restart snmptrapd
systemctl start snmptt
启动snmptt时发生报错:
1、
需要安装perl-Config-IniFiles,如果yum源找不到软件包,可以下载源码包再用yum local install perl-Config-IniFiles-2.79-1.el7.noarch.rpm解决依赖关系
2、
如上需要安装perl-Sys-Syslog
6、测试snmptrap接收以及snmptt解析功能
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"
四、zabbix配置监控与告警
1、创建监控主机
主机接口需要与发送trap信息设备的IP一致
2、添加snmptrap监控项
3、设置触发器
snmptrap信息特殊性一般需要手动设置恢复表达式,另外可能一条信息包含多个接口的状态,所以事件生成要选择“多重”,事件关闭要设置为“匹配标签”使告警不会被误关闭。
4、使用regsub/iregsub宏函数配置标签
五、SNMPTT使用技巧
1、自动创建snmptt.conf 解析规则
snmptt.conf定义了解析规则,自己单独为OID创建解析规则太过繁琐。
1.1、转换mib命令格式:
nmpttconvertmib -in=path-to-mib -out=/tmp/snmptt.conf --net_snmp_perl
# 将path-to-mib文件自动解析并将转换结果追加到snmptt.conf文件中
1.2、大量mib文件批量转换:
#由于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
1.3、修改转换后的snmptt.conf文件,每个 FORMAT 行都需要添加ZBXTRAP,否则ZABBIX无法解析
sed -r -i "s/^(FORMAT)/\1 ZBXTRAP \$aA/g" /tmp/snmptt.conf
grep "FORMAT" /tmp/snmptt.conf #检查修改结果
1.4、在snmptt.ini配置文件中添加新的解析规则conf文件
vi /etc/snmptt/snmptt.ini
###
snmptt_conf_files = <<END
/etc/snmptt/snmptt.conf
/tmp/snmptt.conf
END
###
systemctl restart snmptt
注意:conf文件中的解析规则不要重复,否则同一个snmptrap事件会匹配多个规则,并生成多条事件。
2、snmptt.conf解析规则中的”EXEC”/“PREEXEC”属性可以实现很多功能
例如:IP地址自动转换,HEX->IP地址;利用snmpget命令获取trap的描述信息;执行自愈脚本等
案例:通过SNMPTT中”EXEC”属性,自定义外部python脚本,将SNMPTRAP信息hexstring格式进行转码翻译后,再将翻译后的消息写回到SNMPTrapperFile定义的文件中,实现告警事件接入ZABBIX并提升SNMPTRAP信息可读性。
2.1、创建解码脚本
# cat /etc/snmp/translatetraptozbx.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
#description: convert hex-string to string
import sys
import time
# 定义日志信息
logtime=time.strftime('%H:%M:%S %Y/%m/%d',time.localtime())
snmptrapfile="/var/log/snmptt/snmptt.log"
# 将hex转换成中文,hex to gb2312
def hex_to_ascii(hex_str):
try:
hex_str = hex_str.replace('Hex-STRING', '').replace(':','').replace(' ', '').replace('0x', '').replace('\t', '').replace('\n', '')
ascii_str = hex_str.decode('hex').decode('gb2312',errors='ignore')
#except (TypeError):
except :
ascii_str = 'ZBXTRAP can not translate this message'
return ascii_str
# 获取参数:IP [SNMPTRAP OIDS],example:$aA $N $+*
if len(sys.argv) >= 4:
ZBXTRAPHOST=sys.argv[1]
EVENTTYPE=sys.argv[2]
SNMPTRAPMESSAGE=''.join(sys.argv[3:])
KEYWORD='enterprises.3902.4101.1.3.1.3'
if KEYWORD in SNMPTRAPMESSAGE:
alertmessage=SNMPTRAPMESSAGE.replace('enterprises','\nenterprises').split('\n')
eventextnumber=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3','').split(':')[0]
eventtime=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3'+eventextnumber+':','')
eventseverity=alertmessage[9].replace('enterprises.3902.4101.1.3.1.6'+eventextnumber+':','').strip()
alarmid=alertmessage[14].strip()
# 告警等级转换
if eventseverity=='1':
severity="critical"
elif eventseverity=='2':
severity="critical"
elif eventseverity=='3':
severity="major"
elif eventseverity=='4':
severity="major"
elif eventseverity=='5':
severity="warning"
elif eventseverity=='6':
severity="cleared"
else:
severity="unknown"
eventtheme=hex_to_ascii(alertmessage[15].replace('enterprises.3902.4101.1.3.1.14'+eventextnumber+':','').replace(' ',''))
eventsource=hex_to_ascii(alertmessage[16].replace('enterprises.3902.4101.1.3.1.15'+eventextnumber+':','').replace(' ',''))
zbxtrapmessage=logtime+" ZBXTRAP "+ZBXTRAPHOST+" "+eventtime+"-"+ZBXTRAPHOST+" "+EVENTTYPE+",alarmuuid:"+alarmid+",severity:"+severity+" "+eventtheme+" "+eventsource
zbxtrapmessage2=zbxtrapmessage.encode("raw_unicode_escape").decode("raw_unicode_escape").encode("utf8")
with open(snmptrapfile,'a+') as f:
f.write(zbxtrapmessage2)
f.write("\n")
f.close()
print zbxtrapmessage2
else:
sys.exit()
2.2、定义SNMPTRAP事件类型的格式化参数
vim /etc/snmp/snmptt.conf
EVENT ztedesktopalarmNew .1.3.6.1.4.1.3902.4101.1.4.1.1 "Status Events" Normal
FORMAT $aA $N "【告警】$+*"
REGEX(\n)()g
REGEX(\(unknown\))()g
REGEX(\s+)(-)g
EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+*
systemctl restart snmptt
3、snmptt.conf解析规则文件语法
详情参看官网: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]
3.1、EVENT
event_name(事件名称):
- 包含空格的唯一文本标签(别名)。
- 当使用snmpttconvertmib转换时,这将匹配MIB文件中TRAP-TYPE或NOTIFICATION-TYPE行上的名称。
event_OID(事件OID):
- 不包含空格的虚线格式或符号符号的对象标识符字符串,
- 如果通过在snmptt.ini文件中设置net_snmp_perl_enable来安装并启用Net-SNMP Perl模块,也可以使用符号名称。例如:IF-MIB::linkDown。
- OID也可以使用通配符*来匹配结尾所有的Index,或者定义为 .* 匹配所有未知事件。
category(类别):
- 用双引号括起来的字符串
- 如果类别为“IGNORE”,则即使snmpt .conf包含FORMAT和/或EXEC语句,也不会发生任何操作。
- 如果类别为“LOGONLY”,则会像往常一样记录该陷阱,但是EXEC语句将被忽略。
severity(严重性):
- 事件严重程度字符串,日志记录时在输出中使用。
- 例如: Minor(次要), Major(重要), Normal(正常), Critical(紧急), Warning(警告)
- 可以在snmptt.ini配置文件中配置将syslog级别或NT事件日志类型与严重性级别匹配的选项。
3.2 FORMAT
format_string(格式字符串):
- 每个EVENT只能有一个FORMAT行。
- 格式字符串用于生成将被记录到任何支持的日志记录方法的文本。
- 可以使用以下变量对该字符串执行变量替换:
$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
3.3、[EXEC command_string]
[EXEC command_string]
- 每个EVENT可以有多个EXEC行。
- 可选字符串,包含接收到trap后要执行的命令。EXEC行按照它们出现的顺序执行。
- EXEC使用与FORMAT行相同的变量替换。您可以在EXEC行上使用$Fz来添加翻译后的FORMAT行,而不是重复您已经在FORMAT上定义的内容。
例如:
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之类的变量。
[PREEXEC command_string]
- 每个EVENT可以有多个PREEXEC行。
- 可选字符串,包含一条在收到trap后、处理FORMAT和EXEC语句之前执行的命令。外部程序的输出存储在$pn变量中,其中n是从1开始的数字。允许使用多个PREEXEC行。第一个PREEXEC将命令的结果存储在$p1中,第二个PREEXEC将命令的结果存储在$p2中。
- 删除所有结束换行符。
- 可以在snmptt.ini配置文件中修改参数pre_exec_enable用于启用/禁用PREEXEC语句。
- PREEXEC使用与FORMAT行相同的变量替换。
例如:
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也会执行。