Zabbix结合脚本实现服务端口的自动发现

一、通过Python脚本实现自动化发现

1、更改客户端配置文件

位置(通过yum直接安装的客户端):/etc/zabbix/zabbix_agentd.conf

Include=/etc/zabbix/zabbix_agentd.d/*.conf

默认即可。

在对应目录下添加端口监听的配置文件touch /etc/zabbix/zabbix_agentd.d/userparameter_port.conf并添加

UserParameter=port.alert,/etc/zabbix/auto_port.py
# 前面为键值名称,用于建立自动发现
# 后面为脚本位置

2、建立自动发现脚本

根据配置文件路径建立脚本,并通过json模块转换成json格式输出

代码如下(请务必提权!!!):

#!/usr/bin/env python
# coding:utf-8
# @Time : 2020/8/27 15:28
# @Author: 小小の运维
# @File : port_autofind.py

# 生效前需要将用户提权
# 位置 /etc/sudoers
# 添加 zabbix  ALL=(ALL)     NOPASSWD:/usr/sbin/ss

import os
import json
import string

# 端口查询命令
t = os.popen("sudo ss -tunlp |grep LISTEN | sed 's/::/FF/g' |grep users |sort |uniq ")

# 非监听端口列表
port1 = ['22', '1100', '25', '4369']

array = []
for port in t.readlines():
    r = port.strip()
    port = r.split(':')[1].split(' ')[0]
    try:
        name = r.split('\"')[1]
    except:
        name = "none"
    # 判断返回值是否在屏蔽列表中,不在则写入port列表
    if port not in port1:
        cluster = {'{#TCP_PORT}': port, '{#TCP_NAME}': name}

        # 将值末尾追加至array列表中
        array.append(cluster)

amy = [dict(t) for t in set([tuple(d.items()) for d in array])]

# 固定端口添加(非必须)
# extra = [{'{#TCP_NAME}': 'java', '{#TCP_PORT}': '8000'}]
# amy.extend(extra)

# json格式规范化输出
print(json.dumps({'data': amy}, sort_keys=True, indent=4, separators=(',', ':')))

完成后,将脚本文件提权并重启客户端服务。

关键!!

将zabbix用户进行sudo权限的提升,否则脚本无法执行

vim /etc/sudoers添加

zabbix  ALL=(ALL)       NOPASSWD:/usr/sbin/ss

后续步骤,参照下面的后续即可。

二、通过shell脚本预先定义端口实现

1、更改客户端配置文件

位置(通过yum直接安装的客户端):/etc/zabbix/zabbix_agentd.conf

Include=/etc/zabbix/zabbix_agentd.d/*.conf

默认即可。

在对应目录下添加端口监听的配置文件touch /etc/zabbix/zabbix_agentd.d/userparameter_port.conf并添加

serParameter=port.alert,/etc/zabbix/port_alert.sh
# 前面为键值名称,用于建立自动发现
# 后面为脚本位置

2、建立自动发现脚本

根据配置文件路径建立脚本,并将获得的值人工更改为json格式

脚本如下:

#/bin/bash
CONFIG_FILE=/etc/zabbix/port.conf
Check(){
    grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -vE '^ *[0-9]+' &> /dev/null
    if [ $? -eq 0 ]
    then
        echo Error: ${CONFIG_FILE} Contains Invalid Port.
        exit 1
    else
        portarray=($(grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -E '^ *[0-9]+' | awk -F: '{print $1}'))
        name=($(grep -vE '(^ *#|^$)' ${CONFIG_FILE} | grep -E '^ *[0-9]+' | awk -F: '{print $2}'))
        ip=($())
    fi
}
PortDiscovery(){
    length=${#portarray[@]}
    echo "{"
    echo -e '\t'"\"data\":["
    for ((i=0;i<$length;i++))
      do
        printf '\t\t{'
        printf "\n\t\t\t\"{#TCP_PORT}\":\"${portarray[$i]}\","
        printf "\n\t\t\t\"{#TCP_NAME}\":\"${name[$i]}\""
        printf "\n\t\t}"
        if [ $i -lt $[$length-1] ];then
                    echo ','
        fi
      done
    printf  "\n\t]\n"
    echo "}"
}
port(){
    Check
    PortDiscovery
}
port

并手动建立包含对应服务的端口及名称的文件

# zabbix-agent端口
1100:zabbix-agent

# mysql端口
3306:mysql

# Jenkins-web端口
8080:Jenkins-web

# Jenkins端口
50000:Jenkins

# Sonar-mysql端口
3310:Sonar-mysql

# Sonar-web端口
8088:Sonar-web

# 测试nginx端口
800:nginx测试

完成后,将脚本文件提权并重启客户端服务即可

3、服务端验证

如果正常,则服务端可通过zabbix_get -s 192.168.142.100 -p 1100 -k port.alert命令即可正常收到返回的json格式文本。

其中,-s后为客户端地址,-p后为客户端端口,默认为10050,-k后为设定好的键值名称

zabbix怎么获取多个端口的设备全部端口流量 zabbix端口自动发现_客户端

4、页面添加自动发现机制

配置 ——》 模板 ——》 新建模板或是在原有模板上均可 ——》 自动发现规则 ——》创建发现规则

zabbix怎么获取多个端口的设备全部端口流量 zabbix端口自动发现_python_02

完成规则建立后 ——》 监控项原型 ——》 创建监控项原型

zabbix怎么获取多个端口的设备全部端口流量 zabbix端口自动发现_运维_03


最后将模板链接至对应主机即可