zabbix自动发现并监控tcp端口

公司有部分Windows Server2008系统的服务器,每台上面都有几十个端口,如果一个个添加那人都要疯了,所以研究了一下自动发现端口并加入监控

Windows

1、Windows服务器安装python环境(直接安装,默认路径即可)

http://app-zlf.oss-cn-hangzhou.aliyuncs.com/python_2.7.13150.msi

2、准备python脚本,保存为(D:\python_script\check_port.py)

#!/usr/bin/python
__author__ = 'Yan'
import os
import json

data = {}
tcp_list = []
port_list = []
command = 'netstat -ano -p tcp| find "LISTENING" '
lines = os.popen(command).readlines()
for line in lines:
    port = line.split()[1].split(':')[1]
    port_list.append(port)

for port in list(set(port_list)):
    port_dict = {}
    port_dict['{#TCP_PORT}'] = port
    tcp_list.append(port_dict)

data['data'] = tcp_list
jsonStr = json.dumps(data, sort_keys=True, indent=4)
print jsonStr

3、修改zabbix_agentd.conf,加入如下(python使用全路径,不用配置环境变量)

UnsafeUserParameters=1
UserParameter=tcpportlisten,C:\Python27\python D:\python_script\check_port.py

4、重启zabbix_agentd

5、在zabbix_server端用命令检查看看能否获得数据

zabbix_get -s XXX.XX.XX.XXX -p 10050 -k tcpportlisten

6、开始配置监控模板

a、配置——模板——创建模板——模板名称“Tcp_Port_Discover”——创建

TIM截图20170625014434.png

b、点击该模板的“自动发现”——“监控项原型”——“创建发现规则”——名称“tcp port discover”——键值“tcpportlisten”——创建

TIM截图20170625013113.png

c、点击“监控项原型”——“创建监控项原型”——名称“TCP Port $1”——键值“net.tcp.listen[{#TCP_PORT}]”——创建

TIM截图20170625013057.png

d、点击该模板的“自动发现规则”——“触发器类型”——名称“TCP_Port  {#TCP_PORT} Down on {HOST.NAME}”——表达式“{Tcp_Port_Discover:net.tcp.listen[{#TCP_PORT}].count(#3,0,eq)}>1”——创建

TIM截图20170625013034.png

.count(#3,0,eq)}>1 #表示最后三次的值等于0,触发次数大于一次则报警

7、把模板添加到被监控主机,如无意外,即可自动发现tcp端口并监控
TIM截图20170625013005.png


Linux

linux服务器原理一样,只是脚本有区别,这里是监控mongodb端口的shell脚本

#!/bin/bash
#port_array=(`netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq   2>/dev/null`)
#port_array=(`ss -lnt|awk {'print $4'}|awk -F ':' '{print $NF}'|grep -v "Local"|sort -n|uniq 2>/dev/null`)
port_array=(`netstat -tpln | awk -F "[ :]+" '/mongo/ && /0.0.0.0/ {print $5}' 2>/dev/null`)
length=${#port_array[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
        printf '\n\t\t{'
        printf "\"{#MONGO_PORT}\":\"${port_array[$i]}\"}"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"
添加新评论