nagios之集成snmptt
一、什么是SNMPTT(SNMP Trap Translator)
成都创新互联是专业的通河网站建设公司,通河接单;提供网站制作、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行通河网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
SNMPTT是用perl写的SNMP trap处理器,它需要使用Net-SNMP/UCD-SNMP snmptrapd程序。SNMPTT支持Linux,Unix和Windows。具体工作原理如下图:
Net-SNMP程序的snmptrapd是收集和记录SNMP trap,并通过TCP/IP发送消息的程序。
snmptrapd程序接收到的告警的输出如下,一般格式为 variable name=value, variable name=value。
Feb 12 13:37:10 server11 snmptrapd[25409]: 192.168.110.192: Enterprise Specific Trap (3008) Uptime: 306 days, 23:13:24.29, .1.3.6.1.2.1.1.5.0 = SERVER08, .1.3.6.1.4.1.232.11.2.11.1.0 = 0, .1.3.6.1.4.1.232.3.2.3.1.1.4.8.1 = rebuilding(7)
FORMAT Logical Drive Status Change: Status is now $3.
Feb 12 13:37:13 server11 TRAPD: .1.3.6.1.4.1.232.0.3008 Normal "XLOGONLY" server08 - Logical Drive Status Change: Status is now rebuilding
*接受或拒绝一个trap信息,基于主机名/IP地址/网络段/trap变量中的值
*执行外部程序来发送page,email等
*执行正则表达式来匹配和替换消息中的内容。
二、软件前提需求
1.perl及模块支持
(2). Required: Net-SNMP (formerly known as UCD-SNMP). Specifically snmptrapd.
(3). Required: Text::ParseWords module (included with most distributions including ActivePerl)
(4). Required: Getopt::Long module (included with most distributions including ActivePerl)
(5). Required: Posix module (included with most if not all distributions including ActivePerl)
(6). Required: Config::IniFiles module
(7). Required: Time::HiRes module (only required when using SNMPTT in daemon mode - required by snmptthandler)
(8). Required: Sys::Hostname module (included with most if not all distributions including ActivePerl).
(9). Required: File::Basename module (included with most if not all distributions including ActivePerl).
(10). Required: Text::Balanced module (included with most if not all distributions including ActivePerl).
(1).nagios:3版本以上,下载链接:http://www.nagios.org/download/core
(2).snmptt:1.3版本了,网上有gz包和rpm包,根据自己需求来下载了。
gz包下载地址:http://sourceforge.net/projects/snmptt/
三、snmptt和snmptrapd的安装及配置:
<1>. 下载snmptt.tgz 包解压
<2>. 拷贝snmptt到/usr/sbin, 加可执行权限(chmod +x snmptt)
<3>. 拷贝snmptthandler到/usr/sbin,加可执行权限(chmod +x snmptthandler)
<4>. 拷贝snmptt.ini 到/etc/snmp或者/etc。更改文件中的选项。
<5>. 创建日志文件夹/var/log/snmptt
<6>. 创建spool文件夹(daemon mode会使用)
mkdir /var/spool/snmptt/
<7>. 拷贝启动脚本到init.d目录
cp snmptt.init.d /etc/rc.d/init.d/snmptt
chkconfig --add snmptt
chkconfig --level 2345 snmptt on
service snmptt start
snmptt --daemon
<9>. 拷贝日志轮训脚本cp snmptt.logrotate /etc/logrotate.d/snmptt,并根据具体目录更改文件中的路径
<10>. 手工创建snmptt.conf文件,或者使用snmpttconvertmib工具创建。
使用命令:
snmpttconvertmib --in=--out=/etc/snmp/snmptt.conf. \ --exec='/usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1' 例:
*其中MIB file可以到各具体设置的官网上进行下载
<11>. 更改snmptt.ini文件包含snmptt.conf.*文件,并设置选项
<12>. 启动snmptt: service snmptt restart
2.snmptrapd的配置:
<1>.配置snmptrapd的配置文件/etc/snmp/snmptrapd.conf
对于standlone mode: 更改Net-SNMP的snmptrapd.conf配置文件,添加如下行:
traphandle default /usr/sbin/snmptt
对于 daemon mode,更改Net-SNMP的snmptrapd.conf配置文件,增加如下行:
traphandle default /usr/sbin/snmptthandler
第一行:配置一个认证的community,设置所有用户的访问权限:可执行,记录,传递同时方便agent进行使用snmptrap进行命令测试;
第二行:接收到的trap信息默认调用/usr/sbin/snmptt来进行处理。同时也可以针对具体的OID,来指定调用的程序;
第三行:禁止访问控制检查 will disable the above access control checks, and revert to the previous behaviour of accepting all incoming notifications.
第四行:禁止通知的日志记录disables the logging of notifications altogether. This is useful if the snmptrapd application should only run traphandle hooks and should not log traps to any location.
注: snmptrapd.conf有很多很多具体的参数配置,具体可以man一下。
<2>.snmptrapd服务启动配置:
使用如下命令启动snmptrapd,snmptrapd -On.
如果存在/etc/rc.d/init.d/snmptrapd文件,则也要更改添加上选项”-On”。
OPTIONS="-On -Lf /var/log/snmptrapd.log -p /var/run/snmptrapd.pid"
注:具体参数意思可查看帮助
四、snmptt.ini主配置文件的配置
[General]
snmptt_system_name =
mode = standalone
multiple_event = 1
DNS_enable = 0
strip_domain = 0
strip_domain_list = <
END
resolve_value_ip_addresses = 0
net_snmp_perl_enable = 1
net_snmp_perl_best_guess = 2
translate_log_trap_oid = 0
translate_value_oids = 1
translate_enterprise_oid_format = 1
translate_trap_oid_format = 1
translate_varname_oid_format = 1
translate_integers = 1
wildcard_expansion_separator = " "
allow_unsafe_regex = 0
remove_backslash_from_quotes = 0
dynamic_nodes = 0
description_mode = 2
description_clean = 1
threads_enable = 0
threads_max = 10
[DaemonMode]
daemon_fork = 1
daemon_uid = snmptt
pid_file = /var/run/snmptt.pid
spool_directory = /var/spool/snmptt/
sleep = 5
use_trap_time = 1
keep_unlogged_traps = 1
duplicate_trap_window = 0
[Logging]
stdout_enable = 0
log_enable = 1
log_file = /var/log/snmptt/snmptt.log
log_system_enable = 1
log_system_file = /var/log/snmptt/snmpttsystem.log
unknown_trap_log_enable = 1
unknown_trap_log_file = /var/log/snmptt/snmpttunknown.log
statistics_interval = 0
syslog_enable = 0
syslog_facility = local0
syslog_level_debug = <
syslog_level_info = <
syslog_level_notice = <
syslog_level_warning = <
syslog_level_err = <
syslog_level_crit = <
syslog_level_alert = <
syslog_level = warning
syslog_system_enable = 0
syslog_system_facility = local0
syslog_system_level = warning
[Exec]
exec_enable = 1
pre_exec_enable = 1
[TrapFiles]
snmptt_conf_files = <
/etc/snmp/snmptt.conf.hp
END
注:根据自己的需求进行配置各选项,对于和MySQL,pgsql等配置在此不做详解;
五、SNMPTT.CONF 配置文件格式
EVENT event_name event_OID "category" severity
FORMAT format_string
[EXEC command_string]
具体信息参见 snmptt官网
1.EVENT event_name event_OID "category" severity
<1>.event_name:
不能包含空格。当使用snmpttconvertmib转换时,这个名字将与MIB文件中TRAP-TYPE或者NOTIFICATION-TYPE行的名字匹配
<2>.event_OID:
一般形式如:.1.3.6.1.4.1.232.0.11001
如果Net-SNMP perl模块安装,并且在snmptt.ini文件中设置了net_snmp_perl_enable为开启,则可以使用符号名,如: linkDown IF-MIB::linkDown
注:当翻译OID时,Net-SNMP 5.0.9 和更早的版本不支持包含模块名字(如:IF-MIB::) 。
SNMP V1 traps 的企业ID格式为(.1.3.6.1.4.1.232) ,后面跟上一个0,再跟上trap号(11001)。这样可能导致在配置文件中相同的trap OID存在多条定义。如果在snmptt.ini文件中允许了multiple_event,那么将处理所有匹配的traps。如果multiple_event禁止,只有第一个匹配的条目被使用,OID中可以使用通配符,例如:.1.3.6.1.4.1.232.1.2.*
<3>.category
特色字符串包含在双引号中。如果为“IGNORE”,则snmptt.conf中包含的FORMAT和EXEC都忽略。如果类型为“LOGONLY”,则trap信息被日志记录,EXEC声明被忽略。
注:如果你打算使用Naigos等外部程序,则最好不要设置任何trap为LOGONLY,就好像不要使用EXEC来进行被动服务检查。
<4>.severity:
事件的级别,用于日志。如:Minor,Major,Normal,Critical,Warning。
2.FORMAT format_string
每个EVENT只能有一行FORMAT
使用如下的变量在字符串上进行变量替换:
$A - Trap agent host name (see Note 1)
$aA - Trap agent IP address
$Be - securityEngineID (snmpEngineID) (see Note 7)
$Bu - securityName (snmpCommunitySecurityName) (see Note 7)
$BE - contextEngineID (snmpCommunityContextEngineID) (see Note 7)
$Bn - contextName (snmpCommunityContextName) (see Note 7)
$c - Category
$C - Trap community string
$D - Description text from SNMPTT.CONF or MIB file (see Note 6)
$E - Enterprise trap OID in symbolic format
$e - Enterprise trap OID in number format
$Fa - alarm (bell) (BEL)
$Ff - form feed (FF)
$Fn - newline (LF, NL)
$Fr - return (CR)
$Ft - tab (HT, TAB)
$Fz - Translated FORMAT line (EXEC only)
$G - Generic trap number (0 if enterprise trap)
$H - Host name of the system running SNMPTT
$S - Specific trap number (0 if generic trap)
$N - Event name defined in .conf file of matched entry
$i - Event OID defined in .conf file of matched entry (could be a wildcard OID)
$O - Trap OID in symbolic format (see Note 4)
$o - Trap OID in numerical format (see Note 4)
$R, $r - Trap hostname (see Note 1)
$aR, $ar - IP address
$s - Severity
$T - Uptime: Time since network entity was initialized
$X - Time trap was spooled (daemon mode) or current time (standalone mode)
$x - Date trap was spooled (daemon mode) or current date (standalone mode)
$# - Number of (how many) variable-bindings in the trap
$$ - Print a $
$@ - Number of seconds since the epoch of when the trap was spooled (daemon mode) or the current time (standalone mode)
$n - Expand variable-binding n (1-n) (see Note 2,5)
$+n - Expand variable-binding n (1-n) in the format of variable name:value (see Note 2,3,5)
$-n - Expand variable-binding n (1-n) in the format of variable name (variable type):value (see Note 2,3,5)
$vn - Expand variable name of the variable-binding n (1-n)(see Note 3)
$* - Expand all variable-bindings (see Note 5)
$+* - Expand all variable-bindings in the format of variable name:value (see Note 2,3,5)
$-* - Expand all variable-bindings in the format of variable name (variable type):value (see Note 2,3,5)
* 注2:如果snmptt.ini文件中的translate_integers被允许,SNMPTT将尝试查找MIB文件,将收到的trap中的数字转换为文本。为了使这个功能可用还有如下条件需要满足:必须安装了Net-SNMP/UCD-SNMP模块,并在snmptt.ini文件中开启了net_snmp_perl_enable选项。
另外,为了是该功能可用,需要确保Net-SNMP/UCD-SNMP配置正确。如果选项开启,却没有将数字转换成文本,数字将会使用。如果MIB文件存在,但是却没有转换,需要在snmp.conf文件中正确配置,来处理所有的mibs。或者,你可以在snmptt.ini文件中设置mibs_enviroment变量为ALL
* 注3:如果需要$vn,$+n,$-n变量名和类型转换为文本,则也需要在snmptt.ini文件中开启net_snmp_perl_enable选项。 这个其实和注2一样。
* 注4:如果需要将数字的OID转换为文本,需要在snmptt.ini文件中,开启translate_trap_oid选项和net_snmp_perl_enable选项,并安装了Net-SNMP/UCD-SNMP模块。
* 注6:snmptt.ini文件中必须设置description_mode值为1或者2。 如果设置为1,描述从SNMPTT.CONF文件中获取。如果设置为2,描述从MIB文件中获取。
3.[EXEC command_string]
可以一个EVENT,多行EXEC。
当一个trap接收到后,则按照顺序执行命令。
EXEC使用的变量替换跟FORMAT行中的一样。 例如:
EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
EXEC c:\snmp\pager netops "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
4.此次案例中snmptt.conf.cisco文件的内容为:
#端口开启操作定义
EVENT authenticationFailure .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal
FORMAT Link Up
EXEC /apps/usr/nagios/libexec/eventhandlers/submit_check_result "$A" "Snmp_Trap" "2" "$2 $Fz"
#端口关闭操作定义
EVENT authenticationFailure .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT Link Down
EXEC /apps/usr/nagios/libexec/eventhandlers/submit_check_result "$A" "Snmp_Trap" "2" "$2 $Fz"
[PREEXEC command_string]
每个EVENT,可以有多行PREEXEC
当 一个trap收到后,在FORMAT和EXEC声明执行之前,要执行得语句和命令。外部程序的输出将保存在$pn变量中,n从1开始计数。当有多行 PREEXEC时,第一个PREEXEC存储结果到$p1,第二个PREEXEC将结果存在$p2。要开启这个功能,需要在snmptt.ini文件中, 设置pre_exec_enable选项
例子:
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
6. NODES
[NODES sources_list]
可以限制哪些设备可以映射为事件定义
每个EVENT,可以有多个NODES行。
sources_list中可以包含任意主机名、IP地址、网络地址或者文件名的组合。如果这个字符串被省略,则所有的设备都被接受。
如果想192.168.1.0/24网段的设备可以触发这个EVENT, 你可以使用一条NODE语句:
NODES 192.168.1.0/24
这里有两种操作模式,POS(positive-默认)和NEG(negative)。如果设置为POS,那么NODES中的任何一行匹配,则允许。如果设置为NEG,只有当NODES中都不匹配时,才允许。为了改变操作模式,使用如下声明:
NODES MODE=POS
NODES MODE=NEG
例一
NODES fred barney betty wilma
例二
NODES fred barney betty wilma
NODES MODE=NEG
7. MATCH
[MATCH [MODE=[or | and]] | [$n:[!][( )[i] | n | n-n | > n | < n | x.x.x.x | x.x.x.x-x.x.x.x | x.x.x.x/x]]
匹配这个MATCH的trap,才可以引发相应的EVENT定义。
如果一条MATCH声明已经存在,没有trap匹配它,默认的,没有EVENT定义会被匹配。
如下的perl正则表达式被支持:
i – 忽略大小写
如下的命令模式可用:
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
reg是正则表达式
! 是用于negate结果(非)
& 相当于AND
n 是一个数字
x.x.x.x 是IP地址
x.x.x.x-x.x.x.x 是IP地址段
x.x.x.x/x 是IP段
如果模式设置为’or’,只要有一条匹配,则认为结果是true;如果模式为and,只要有一 条匹配失败,则认为结果为false。
在表达式中使用圆括号(),需要跟在\号之后。
如果没有MATCH MODE=这样的行存在,默认为or。
每个EVENT,只能有一条match mode存在。如果多行MATCH MODE=存在,只有最后一样被使用。
$2必须在1000到2000之间:MATCH $2: 1000-2000
任何匹配(or):$3等于52,或者$4是IP地址段192.168.1.10-192.168.1.20,或者severity为Major:
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
8. REGEX
[REGEX( )( )[i][g][e]]
在translated FORMAT/ EXEC行 进行搜索和替换。
多个REGEX()()行被允许。
第一个()包含了查找的表达式;第二个()包含了替换的文本。
i - 当匹配左侧时忽略大小写
g - 替换所有匹配的部分,而不是仅替换查找到的第一个匹配
e - 执行右侧的代码
为了使用capture替换,或者e参数,需要在snmptt.ini文件中设置allow_unsafe_regex为1
如果有多行REGEX,那么从上到下的处理,并且结果是累加的。即第二行处理第一行产生的结果。
处理前的FORMAT行:UPS has detected a building alarm. Cause: UPS1 Alarm #14: Building alarm 3.
REGEX (Building alarm 4)(Moisture detection alarm)
REGEX (roOm)(ROOM)ig
REGEX (UPS)(The big UPS)
REGEX (\s+)( )g
列2:在查找部分使用圆括号,需要前面加上\。替换部分不需要使用
REGEX (\(1\))(One)
REGEX (\(2\))((Two))
处理前的FORMAT行:The system has logged exception error 55 for the service testservice
处理前的FORMAT行:Authentication Failure Trap from IP address: C0 A8 1 FE
9. SDESC EDESC
这两个标识符之间的是描述,会被snmptt忽略。
1.Standalone 模式
为了在standalone模式下使用SNMPTT,snmptrapd.conf文件需要包含如下行:
traphandle default /usr/sbin/snmptt
当SNMPTRAPD收到一个trap,将这个trap传递给/usr/sbin/snmptt脚本。SNMPTT执行如下的任务:
* 读取从snmptrapd传递的trap
* 载入包含trap定义的配置文件
* 查找trap的匹配
* 记录日志,执行EXEC语句等
* 退出
当SNMPTT运行在daemon模式时,需要在snmptrapd.conf文件中,添加如下行:
traphandle default /usr/sbin/snmptthandler
* 读取从snmptrapd传递过来的trap
* 将trap写到/var/spool/snmptt目录中的一个唯一文件
* 退出
* 启动时,载入包含trap定义的配置文件
* 从spool目录读取trap
* 从trap中查找匹配
* 日志记录,执行EXEC声明等
* 休眠5秒钟
* loops back up to ‘从spool目录读取trap’.
3.SNMPTT.CONF 配置文件Notes
当在配置文件中对相同的trap存在多个定义时,如下的规则被应用:
A match occurs when:
* 接收到的trap的OID匹配配置文件中定义的OID
* AND(当主机名匹配NODES中定义的主机名,或者没有NODES定义)
* AND(MATCH部分匹配为true ,或者没有MATCH条目)
* 一个trap匹配配置文件中的多个定义,则被处理多次
* 如果所有的精确匹配都符合,那么通配符匹配将不执行
* 如果一个精确匹配不存在,通配符匹配被执行,假如(主机名匹配NODES中定义的主机或者没有NODES定义)和(MATCH部分匹配为真或者没有MATCH定义)
* trap匹配到的第一个定义被处理
* 如果一个精确匹配存在,通配符匹配将不执行
* 如果一个精确匹配不存在,通配符匹配被执行,假如主机名匹配NODES中定义的主机或者没有NODES定义)和(MATCH部分匹配为真或者没有MATCH定义)
如果配置选项 dns_enable设置为0 (禁止),那么AGENT的主机名在变量$A , NODES匹配,数据库中的hostname列,中不可用。仅有一种例外,主机IP地址同agent IP地址相同,snmptrapd配了解析主机名。在这种情况下,主机名将会被agent名字替代。
七、 同Nagios的集成
被动检查允许Nagios处理由外部程序提交的检查结果。使用SNMPTT的EXEC声明,接收到的trap可以通过Nagios的submit_check_result脚本船体给Nagios。一旦Nagios收到,trap将会被记录日志,发邮件等。
收到SNMPTT转换的trap,当为这个定义了服务,服务必须定义为volatile。当一个服务的状态从OK变为non-OK,则联系人被通知。一般的Nagios的一个服务,没有定义volatile,意味着,另一个服务检查被执行了,状态仍然为non-OK, 那么联系人不会被通知。因为这里为SNMP traps只定义一个服务条目,我们需要确保每次收到trap,我们都被通知。
如下是一个Nagios服务条目
define service{ host_name 127.0.0.1 service_description SNMP TRAP check_command check-host-alive is_volatile 1 check_period 24x7 max_check_attempts 1 normal_check_interval 1 retry_check_interval 1 active_checks_enabled 0 passive_checks_enabled 1 check_freshness 0 event_handler_enabled 1 flap_detection_enabled 0 process_perf_data 1 notification_period 24x7 notification_options w,u,c,r notifications_enabled 1 notification_interval 31536000 contact_groups somegroup }
4. Creating the SNMPTT EXEC statement
Nagios 应该包含了脚本submit_check_result在contrib/eventhandlers目录。在libexec下(/usr/local /nagios/libexec)创建一个eventhandlers目录,拷贝submit_check_result脚本到这个目录中,并加上可执行 权限(chmod a+x submit_check_result)
submit_check_result脚本需要如下参数:
host_name
svc_description
return_code
plugin_output
EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1 "xxxxxx"
EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1 "Drive $1 in bay $2 has failed"
使用上面的配置,一旦收到某主机的trap,它将保持WARNING状态。为了从Nagios console中清除trap,打开TRAP服务,单击’Schedule an immediate check of this service’. 这将导致定义的服务检查被运行(check-host-alive),然后状态变为OK,warning被清除。
另外一种选择是使用check-host-alive创建一条新的命令,叫做reset-trap:
#!/bin/sh
/bin/echo "OK: No recent traps received"
exit 0
要使freshness检查启动,需要normal_check_interval为1,valid check_period 设置为24x7,并添加如下的定义:
check_freshness 1 Enable freshness checking
freshness_threshold 86400 Reset trap alert every 24 hours.
文章题目:nagios之集成snmptt
当前链接:http://scyanting.com/article/ijdiis.html