• snmptrap/snmptt


    Zabbix Snmp Trap 配置

    1. Zabbix Server 操作

    1.1 Snmp Trap 安装配置

    yum install -y net-snmp net-snmp-utils
    
    vim /usr/lib/systemd/system/snmptrapd.service
    ExecStart=/usr/sbin/snmptrapd $OPTIONS -f -O n
    
    vim /etc/snmp/snmptrapd.conf
    authCommunity execute public
    traphandle default /sbin/snmptthandler
    
    systemctl enable snmptrapd
    systemctl start snmptrapd
    netstat -unpl |grep 162
    

    1.2 SnmpTT 安装配置

    # rpm -ivh http://dl.fedoraproject.org/pub/epel
    yum install snmptt perl-Sys-Syslog
    vim /etc/snmp/snmptt.ini
    
    date_time_format=  %Y/%m/%d %H:%M:%S
    #设置时间格式,读取的SNMPTrap信息之后写入SNMPTrapperFile里的时间格式,也是ZabbixTrapper读取时的时间格式
    
    mode = daemon
    
    
    
    ~~~
    snmptt_conf_files = <<END
    /etc/snmp/snmptt.conf   #默认的格式化日志配置文件
    /etc/snmp/nbu.conf    # 在这里可以指定其他的格式化trap日志的配置文件
    END
    ~~~
    
    
    vim /etc/snmp/nbu.conf   #snmptrapd接受设备打过来的日志信息,传输到snmptt进行格式化,
    ~~~
    EVENT general .1.3.6.1.4.1.318.* "UPSTrap" Error   #EVENT general 固定格式   .1.3.6......匹配日志信息中的oid,后面的.*支持统配,将收到的日志添加 "UPSTrap" Error
    FORMAT ZBXTRAP $ar $+*       # 格式化数据,都打上ZABTRAP 头,$ar $+*     $ar一般是ip,$+*就是后面的oid信息
    EXEC /etc/snmp/xxxx.py "$+*"  #执行指定的py脚本,传入format中匹配的参数,
    ~~~
    

    xxxx.py中的处理 #在EXEC中指定执行的脚本

    def handle(param):     
    
        param = """127.0.0.1 .1.3.6.1.4.1.318.2.3.10.0:B925f92_nbErrorCond_E7DC65F3 .1.3.6.1.4.1.318.2.3.23.0:E5 80 BC E9 94 99 E8 AF AF  .1.3.6.1.4.1.318.2.3.1.0:9 .1.3.6.1.4.1.318.2.3.11.0:B925f92_nbSNMPEnc156223BD .1.3.6.1.4.1.318.2.3.24.0:E5 85 AC E5 AE 89 E9 BA BB E8 B1 AA E6 94 AF E8  A1 8C 20 28 31 30 2E 34 32 2E 37 30 2E 31 39 39  29  .1.3.6.1.4.1.318.2.3.16.0: .1.3.6.1.4.1.318.2.3.25.0:UPS .1.3.6.1.4.1.318.2.3.17.0:US1503103638 .1.3.6.1.4.1.318.2.3.20.0:Smart-UPS RT 5000 XL .1.3.6.1.4.1.318.2.3.21.0:10.42.70.199 .1.3.6.1.4.1.318.2.3.26.0:E6 B9 96 E5 8C 97 E7 9C 81 E8 8D 86 E5 B7 9E E5  B8 82  .1.3.6.1.4.1.318.2.3.27.0:E6 9D 8E E6 99 93 E7 BB B4  .1.3.6.1.4.1.318.2.3.22.0:B925f92_nbSNMPEnc156223BD_UPS_BASIC_OUTPUT_STATE .1.3.6.1.4.1.318.2.3.28.0:55 50 53 20 E6 93 8D E4 BD 9C E6 A8 A1 E5 BC 8F  .1.3.6.1.4.1.318.2.3.29.0:1 .1.3.6.1.4.1.318.2.3.6.0:1547028468 .1.3.6.1.4.1.318.2.3.7.0:1547028528 .1.3.6.1.4.1.318.2.3.30.0:27 55 50 53 20 E6 93 8D E4 BD 9C E6 A8 A1 E5 BC  8F 27 E7 9A 84 E5 80 BC E8 A1 A8 E6 98 8E E4 B9  8B E5 89 8D 27 E4 B8 A5 E9 87 8D 27 E8 AD A6 E6  8A A5 E6 9B BE E7 BB 8F E5 8F 91 E7 94 9F EF BC  8C E4 BD 86 E8 AF A5 E5 80 BC E7 8E B0 E5 9C A8  E5 B7 B2 E6 81 A2 E5 A4 8D E6 AD A3 E5 B8 B8 E3  80 82
    """
        data = {}
        param_list = param.split('.1.3.6.1.4.1.318.2.3.')[1:]  #使用1.3.6.1.4.1.318.2.3来切割字符串,得到.1.3.6.1.4.1.318.2.3.后面的值 >'10.0:B925f92_nbErrorCond_E7DC65F3 ',
    
    """
    param.split('.1.3.6.1.4.1.318.2.3.')
    ['127.0.0.1 ',
     '10.0:B925f92_nbErrorCond_E7DC65F3 ',
     '23.0:E5 80 BC E9 94 99 E8 AF AF  ',  16位转码  值错误
     '1.0:9 ',
     '11.0:B925f92_nbSNMPEnc156223BD ',
     '24.0:xxxxxxxxxxx ',  公安xx支行 (10.xx.xx.xxx)
     '16.0: ',
     '25.0:UPS ',
     '17.0:US1503103638 ',
     '20.0:Smart-UPS RT 5000 XL ',
     '21.0:10.42.70.199 ',
     '26.0:E6 B9 96 E5 8C 97 E7 9C 81 E8 8D 86 E5 B7 9E E5  B8 82  ',  湖北省荆州市
     '27.0:E6 9D 8E E6 99 93 E7 BB B4  ',
     '22.0:B925f92_nbSNMPEnc156223BD_UPS_BASIC_OUTPUT_STATE ',
     '28.0:55 50 53 20 E6 93 8D E4 BD 9C E6 A8 A1 E5 BC 8F  ',   UPS 操作模式
     '29.0:1 ',
     '6.0:1547028468 ',
     '7.0:1547028528 ',
     '30.0:27 55 50 53 20 E6 93 8D E4 BD 9C E6 A8 A1 E5 BC  8F 27 E7 9A 84 E5 80 BC E8 A1 A8 E6 98 8E E4 B9  8B E5 89 8D 27 E4 B8 A5 E9 87 8D 27 E8 AD A6 E6  8A A5 E6 9B BE E7 BB 8F E5 8F 91 E7 94 9F EF BC  8C E4 BD 86 E8 AF A5 E5 80 BC E7 8E B0 E5 9C A8  E5 B7 B2 E6 81 A2 E5 A4 8D E6 AD A3 E5 B8 B8 E3  80 82']  UPS 操作模式'的值表明之前'严重'警报曾经发生,但该值现在已恢复正常。
    
    param.split('.1.3.6.1.4.1.318.2.3.')[1:]
    将首位的ip去掉,剩下的就是对应的oid信息
    '10.0:B925f92_nbErrorCond_E7DC65F3 ',
     '23.0:E5 80 BC E9 94 99 E8 AF AF  ',
     '1.0:9 ',
     '11.0:B925f92_nbSNMPEnc156223BD ',
     '24.0:E5 85 AC E5 AE 89 E9.......
    """
    
    
    
    
        for item in param_list:
            key, value = item.split(':')   #用:来切割,得到所有的oid及其对应的值   >>> '10.0', 'B925f92_nbErrorCond_E7DC65F3 '
            key = key.split('.')[0]           #对key在进行.切割,获取统配oid后的第一位值
            data[key] = value               #构造字典,键值对应,以统配后的首位oid值为键
            if key in ['23', '24', '26', '27', '28', '30']: #对key进行筛选,
                value = binascii.a2b_hex(value.replace(' ', '')).decode('utf8')    #snmptt中收到的信息是16进制转码的,需要对16位进行转义,replace将空格去掉,
            else:
                value = value.strip() #对于取值不是16位进制的,直接进行去空操作
            data[key] = value
        host = data['24'].split(' ')[0].strip() #trap信息中24打头oid指代的就是监控系统中配置的host信息
        ip = data['21'].strip()
        end = int(data['7'])
        if end:
            value = 0
        else:
            value = 1
        if value:   #对告警还是回复进行检查
            key, value = check_alert_key(data) 
        else:
            key, value = check_recover_key(data) 
        start = int(data['6'])
        end = int(data['7'])
        msg = data['30']
        #logging.info(data['29'], data['30'])
        return host, ip, key, value, start, end, msg
    
    
    if __name__ == '__main__':
        if len(sys.argv) > 1:
            arg = sys.argv[1]
            ret = handle(arg)  #接受传入参数,这里是匹配的$+*,就是匹配的所有的oid信息
        
            """
    ('E5', 'xx.xx.xx.xxx', 'ups.operation.mode', 0, 1547028468, 1547028528, "'UPS 操作模式'的值表明之前'严重'警报曾经发生,但该值现在已恢复正常。")
    
            """
            sender = ZabbixSender()  #使用了zabbixsender来给server端发送数据
            sender.add(ret[1], ret[2], ret[3])  #指定了ip  key   value
            sender.send()  #发送
            item = '[{4} - {5}] host: {0} ip: {1} key: {2} value: {3} message: {6}
    '.format(*ret)
            logging.info(item)
    

    上面有个问题,就是只能对过滤的哪几个key所对应的16进制码进行转码,可以加个处理

            data[key] = value.strip() #对值进行去括号。 
            #if key in ['23', '24', '26', '27', '28', '30']: #对key进行筛选
            不要上面这行了,
            if data['key'] find(' ') !=-1:#对值进行空值查找
                try: #有些不是16进制的字符串中也含有空格,所以使用try对所有进行转码,
                    value = binascii.a2b_hex(value.replace(' ', '')).decode('utf8')    #snmptt中收到的信息是16进制转码的,需要对16位进行转义,replace将空格去掉,
                except Exception as e:  #不能转的的就是剩下的非16进制字符串,直接使用即可,
                    value = value.strip()
            else:
                value = value.strip() #对于取值不是16位进制的,直接进行去空操作
            data[key] = value
    这样就解决了对于host转码的不完整
    
    
    之后可以在snmptt.log中找出匹配的告警内容,手动的更改组成一个oid字符串,然后调用脚本传入参数,将数据发送出去,其中的6键对应的是发生时间,7键对应的是恢复时间,用7键的有无判定是发生告警还是恢复,在手动调用的时候7键值为0,就是发生的告警信息,给7键随便赋值,就可以是恢复了。
    

    重启服务

    systemctl enable snmptt
    systemctl start snmptt
    

    1.3 Zabbix Server 配置

    vi zabbix_server.conf
    vi zabbix_proxy.conf
    SNMPTrapperFile=/var/log/snmptt/snmptt.log
    StartSNMPTrapper=1
    
    systemctl retart zabbix-server
    
    # 测试命令
    snmptrap -v 2c -c public 127.0.0.1 "" 1.3.6.1.4.1.2345 1.3.6.1.4.1.2345 s "test v2"
    发送的 ip 要与主机的 SNMP接口 ip 一致。
    

    snmptrapd与snmptt的工作流程

    1. 例如 hds管理页面配置陷阱的ip 端口和团体名,注意华为类型的格式要求多,中发送测试信息给指定ip的162端,发送的消息传给snmptrapd进程,在指定ip的/var/spool/snmptt/下会生成一个临时文件类似于 #snmptt-trap-1612520804624941

    1612520804
    localhost
    UDP: [127.0.0.1]:35742->[127.0.0.1]:162
    .1.3.6.1.2.1.1.3.0 16:8:37:45.46
    .1.3.6.1.6.3.1.1.4.1.0 .1.3.6.1.4.1.2011.2.15.1.7.1
    .1.3.6.1.4.1.2011.2.15.1.7.1.7.0 "Critical"
    .1.3.6.1.4.1.2011.2.15.1.7.1.10.0 "Recovery"
    .1.3.6.1.4.1.2011.2.15.1.7.1.24.0 "NE_NOT_LOGIN"
    .1.3.6.1.4.1.2011.2.15.1.7.1.3.0 "73 6F 75 72 63 65 3D 39 2D 35 20 E4 B8 96 E7 BA AA E4 BA 92 E8 81 94 44 30 39 20 6C 6F 63 61 74 69 6F 6E 3D E7 BD 91 E5 85 83 39 2D 35 20 E4 B8 96 E7 BA AA E4 BA 92 E8 81 94 44 30 39 E6 9C AA E7 99 BB E5 BD 95"
    .1.3.6.1.4.1.2011.2.15.1.7.1.5.0 "2020/12/30 - 09:11:05Z"
    

    2. snmptrapd.conf中指定了数据转换的handler 允许的团体名

    authCommunity   execute public
    traphandle default /sbin/snmptthandler
    

    3. snmptt进程进行数据格式转化

        snmptt.ini中指定了格式化后的输出日志文件的路径(zabbix 自带的snmptrap类型就取这个日志的相关信息)和相应的格式化配置文件
        #日志路径
        log_file = /var/log/snmptt/snmptt.log
        #指定include的其他格式化配置文件,允许自定义
        /etc/snmp/snmptt.conf
    

    4. snmptt.conf 及其他指定的conf文件中指定了数据格式化的形式

        EVENT general .1.3.6.1.4.1.2.6.182.* "LTOTrap" Error
        FORMAT ZBXTRAP $ar $+*
        EXEC /etc/snmp/lto_trap_handle.py "$ar $+*"
        EVENT general .1.3.6.1.4.1.2.6.201.* "IBMTrap" Error
        FORMAT ZBXTRAP $ar $+*
        EVENT general .1.3.6.1.4.1.116.* "HDSTrap" Error
        FORMAT ZBXTRAP $ar $+*
        EXEC /etc/snmp/hds_trap_handle.py "$ar $+*"
    

    关于FORMAT ZBXTRAP $ar $+*的解释:

    后续若要针对特定oid处理,通过脚本更新。”ZBXTRAP”必须存在,否则zabbix提取数据失败
    后续脚本的入参可以指定这些正则符
    $i = 在 .conf 匹配条目的文件中定义的事件 OID(可能是通配符 OID)
    $O + 以符号格式陷阱OID
    $o + 以数字格式陷印OID
    $R,$r + 陷阱主机名
    $aR, $ar = IP 地址
    $s = 严重性
    $T = 正常运行时间:自初始化网络实体以来的时间
    $X = 时间陷阱已后台处理(守护进程模式)或当前时间(独立模式)
    $x = 日期陷阱已后台处理(守护进程模式)或当前日期(独立模式)
    $# = 陷阱中的变量绑定数
    $$ = 打印 $
    $@ = 自陷阱后台处理(守护进程模式)或当前时间(独立模式)以来的秒数
    $n = 展开变量绑定 n (1-n)
    $+n = 以变量名称格式展开变量绑定 n (1- n):值
    $-n = 以变量名称(变量类型):值的格式展开变量绑定 n (1-n) )
    $vn = 展开变量绑定 n (1-n) 的变量名称
    $* = 展开所有变量绑定
    $=* = 以变量名称格式展开所有变量绑定:值
    $-* = 以变量名称格式展开所有变量绑定
    

    5. 在/var/log/snmptt/snmptt.log文件中就会存上格式化好的数据

    EXEC 中指定执行的脚本,参数就是格式化之后的一个大字符串,在脚本中可以使用公共的oid进行字符切割找出对应的数据,然后使用sender或者自带的zabbixtrap类型监控项去采集数据
    

    6. 一般在修改完配置项之后需要重启snmptrapd 及 snmptt进程

    7. 测试,多个oid信息可以进行拼接

    snmptrap -v 2c -c public 127.0.0.1 "" .1.3.6.1.4.1.2011.2.15.1.7.1 .1.3.6.1.4.1.2011.2.15.1.7.1.7.0 s "Critical"  .1.3.6.1.4.1.2011.2.15.1.7.1.10.0  s  "Recovery" .1.3.6.1.4.1.2011.2.15.1.7.1.24.0 s "NE_NOT_LOGIN" .1.3.6.1.4.1.2011.2.15.1.7.1.3.0 s "73 6F 75 72 63 65 3D 39 2D 35 20 E4 B8 96 E7 BA AA E4 BA 92 E8 81 94 44 30 39 20 6C 6F 63 61 74 69 6F 6E 3D E7 BD 91 E5 85 83 39 2D 35 20 E4 B8 96 E7 BA AA E4 BA 92 E8 81 94 44 30 39 E6 9C AA E7 99 BB E5 BD 95" .1.3.6.1.4.1.2011.2.15.1.7.1.5.0 s "2020/12/30 - 09:11:05Z" 
    
  • 相关阅读:
    CRB and His Birthday(2015多校)
    B. Bear and Three Musketeers
    Uva657
    cas服务端改造
    有用的maven插件
    maven管理的非标准目录
    struts2中的action交由spring管理
    数据库分库
    linux内核系列之二_资源
    linux内核系列之一_工具
  • 原文地址:https://www.cnblogs.com/cizao/p/11544440.html
Copyright © 2020-2023  润新知