Zabbix自动添加端口进程监控

添加端口和进程的监控,一种方案是可以通过模板来定义一组机器需要监控的端口和进程,优点是方案简单且监控准确,缺点是需要维护多套模板,比较适合小规模的团队。当监控规模较大时,需要考虑一种支持自助修改监控项的方案。本文记录一种通过自动发现(Low-Level Discovery)功能来实现自动添加端口进程监控以及支持自助修改的方案。

概述

Zabbix 的 Low-Level Discovery 功能可以通过一个自定义脚本,返回一个特定格式的 JSON 数据:

{
    data: [
        {"{#NAME}": "value"},
        {"{#NAME}": "value"},
        ...
    ]
}

然后将脚本添加为 UserParameter。

UserParameter=lld_proc[*],/usr/local/etc/script/proc.sh
UserParameter=lld_port[*],/usr/local/etc/script/port.sh

然后在模板中配置自动发现。

端口自动发现

端口自动发现是通过 ss 命令来做,核心命令是:

ss -ltpn |awk '{print $4,$6}' |sed 's/::ffff://g' |perl -pe 's/.*?:(\d)/\1/' |sed 's/users:((\"//g'|sed 's/\".*$//' |grep -vE "127.0.0.1|172.17.|Local" |sort -u |grep -v ":" |tr ' ' ':' | grep -v ":$"

输出格式如下:

1080:goproxy
2222:gitea
22:sshd
25:master
3000:gitea

然后将其输出为 Zabbix 自动发现要求的 JSON 格式:

{
	"data":[
		{"{#PROCNAME}":"goproxy", "{#PORT}":"1080"},
		{"{#PROCNAME}":"gitea", "{#PORT}":"2222"},
		{"{#PROCNAME}":"sshd", "{#PORT}":"22"},
		{"{#PROCNAME}":"master", "{#PORT}":"25"},
		{"{#PROCNAME}":"gitea", "{#PORT}":"3000"}
	]
}

为了支持用户自动配置,可以读取一个配置文件,允许用户在配置文件中自定义监控的端口,完整代码如下:

#!/bin/bash
exclude="zabbix_agentd|monit|snmpd|sendmail|moxi|[0-9]{4,5}:java|ceph-osd"
conf="/etc/lld_port.conf"

common="22:sshd|53:dnsmasq|10040:agentd_zx"
kubecommon="$common|10248:kubelet|10249:kube-proxy|10250:kubelet|10256:kube-proxy|179:bird|9099:calico-node"

hostname | grep "k8s-master" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|10251:kube-scheduler|10252:kube-controller|2379:etcd|2380:etcd|443:kube-apiserver"

hostname | grep "k8s-etcd" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|2379:etcd|2380:etcd"

hostname | grep "k8s-router" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|80:nginx|443:nginx"

hostname | grep "k8s-node" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon"

if [ -f $conf ];then
    source $conf
fi

str='{\n\t"data":['
confstr=""

function ntlp()
{
	sudo timeout 5 ss -ltpn |awk '{print $4,$6}' |sed 's/::ffff://g' |perl -pe 's/.*?:(\d)/\1/' |sed 's/users:((\"//g'|sed 's/\".*$//' |grep -vE "127.0.0.1|172.17.|Local" |sort -u |grep -v ":" |tr ' ' ':' | grep -v ":$"
}

if [ "$include"x != ""x ];then
	for id in `echo $include |tr '|' ' '`;do
	    proc=`echo $id | cut -f2 -d':'`
	    port=`echo $id | cut -f1 -d':'`
	    str="$str\n\t\t{\"{#PROCNAME}\":\"$proc\", \"{#PORT}\":\"$port\"},"
	    confstr="$confstr|$port:$proc"
	done
else
	for id in `ntlp |grep -vEw "$exclude"`;do
	    proc=`echo $id | cut -f2 -d':'`
	    port=`echo $id | cut -f1 -d':'`
	    str="$str\n\t\t{\"{#PROCNAME}\":\"$proc\", \"{#PORT}\":\"$port\"},"
	    confstr="$confstr|$port:$proc"
	done
fi
str="$str]\n}"
str=`echo $str |sed 's/,]/\\\\n\\\\t]/g'`
[ $# -lt 1 ] && echo -e $str || echo $confstr |sed 's/^|//g'

然后用户可以在 /etc/lld_port.conf 文件中修改 includeexclude 配置,比如,使用自定义的 include,只监控 22 和 53 端口:

include="22:sshd|53:dnsmasq"

进程自动发现

和端口自动发现的思路一样。

#!/bin/bash

include="rcgroupchat_ser|codis-proxy|codis-server|codis-config|haproxy|gateway-server|turnserver|comet-server|rpc-server|videocall-server|consul|consul-replicate|telegraf|kapacitord|influxd|^docker$|ares|mesos-slave|crond|rabbitmq-server|show_count.py|dds|dns.py|dispatcher.py|qpsservice.py|filebeat|notification|pre-ark-adapter|rsyslog|adfz2_engine|ssp_engine|dispatcher_serv|afp|ssp|delivery|freq|bigdatacollecti|adx_tracking|kube-proxy|kube-controller|kube-scheduler|kube-apiserver|kubelet|calico-node|etcd|nginx-ingress-c|ceph-osd"

conf="/etc/lld_proc.conf"

hostname | grep -E "k8s-" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="crond|kube-proxy|kube-controller|kube-scheduler|kube-apiserver|kubelet|calico-node|etcd|nginx-ingress-c"

[ -f $conf ] && source $conf

str='{\n\t"data":['
for id in `ps -A |awk '{print $NF}' |sort -u |grep -Ew "$include"`;do
	str="$str\n\t\t{\"{#PROCNAME}\":\"$id\"},"
done
str="$str]\n}"
str=`echo $str |sed 's/,]/\\\\n\\\\t]/g'`
echo -e $str

输出示例:

{
	"data":[
		{"{#PROCNAME}":"crond"},
		{"{#PROCNAME}":"nginx"},
		{"{#PROCNAME}":"supervisord"}
	]
}

后记

这种方案要求用户自己去修改 /etc/lld_port.conf/etc/lld_proc.conf 文件来实现自定义,当机器比较多时是很繁琐的,对用户并不友好。如果用户不去维护,就可能导致自动添加了一些并不需要的端口和进程,带来一些无关紧要的报警。一个可能的解决方案是,通过 iTop CMDB 之类的工具来降低维护成本,将监控项也管理起来,允许用户在 CMDB 中配置监控项,对一组机器或者单台机器配置端口进程自动发现规则,机器上跑定时任务去更新 /etc/lld_port.conf/etc/lld_proc.conf,类似 登录时显示服务器信息 里的方式。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注