RSS

Zabbix监控Linux服务的自动发现

最近研究 zabbix,发现默认的模版不能检测到 Linux 的服务以及端口,这样就不能基于端口对服务进行监控。通过查找,找到了办法。

1.调用服务

在 github 上有一个库,用 go 语言写的,功能类似于系统的 netstat 命令,可查看端口和服务

[github.com/drael/GOnetstat](“github.com/drael/GOnetstat”)

当然你也可以自己用别的语言去实现,恰巧最近在学 go 语言,所以就用它的了,贴一个简单的获取 tcp 端口服务的程序

package main

import (
"encoding/json"
"fmt"
"github.com/drael/GOnetstat"
"log"
)

type Process struct {
Name string `json:"{#PROCNAME}"`
Port int64 `json:"{#PORT}"`
}

type ZabbixData struct {
Data []Process `json:"data"`
}

func main() {
data := GOnetstat.Tcp()
var zd = new(ZabbixData)

    for _, p := range data {
    	if p.State == "LISTEN" {
    		zd.Data = append(zd.Data, Process{p.Name, p.Port})
    	}
    }

    output, err := json.MarshalIndent(zd, "", "    ")
    if err != nil {
    	log.Fatal(err)
    }

    fmt.Println(string(output))

}

编译为 tcp_services,放到/usr/bin/目录下,并赋予执行权限

cp tcp_services /usr/bin/
chmod +x /usr/bin/tcp_services
测试
[root@proxy bin]# /usr/bin/tcp_services
{
    "data": [
        {
            "{#PROCNAME}": "Master",
            "{#PORT}": 25
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 24224
        },
        {
            "{#PROCNAME}": "Zabbix_agentd",
            "{#PORT}": 10050
        },
        {
            "{#PROCNAME}": "Zabbix_proxy",
            "{#PORT}": 10051
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 24230
        },
        {
            "{#PROCNAME}": "Snmpd",
            "{#PORT}": 199
        },
        {
            "{#PROCNAME}": "Svnserve (Deleted)",
            "{#PORT}": 3690
        },
        {
            "{#PROCNAME}": "Nginx",
            "{#PORT}": 80
        },
        {
            "{#PROCNAME}": "Sshd",
            "{#PORT}": 22
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 8888
        }
    ]
}

有以上返回,说明程序工作正常
我已编译好,大家可下载

2.设置 zabbix_agentd

编辑 zabbix_agentd.conf 添加如下

UserParameter=udp_services, sudo /usr/bin/tcp_services

同时编辑,/etc/sudoers.d/zabbix

vi /etc/sudoers.d/zabbix
Defaults:zabbix !requiretty
zabbix ALL=NOPASSWD: /usr/bin/tcp_services

我就添加一个 tcp 的,udp 的可照着添加一个就可以了,添加好之后重启 zabbix_agentd

3.zabbix 设置

zabbix 里导入模版,导入之后,添加模版到主机

1

等一会,就会发现已经识别了端口,并且设置了警报触发

2
触发器
3

4.Debug

A.检查是否关闭SElinux<br /> B.在zabbix_server上执行操作(IP_DO_SERVIDOR_MONITORADO为被监控端ip
zabbix_get -s IP_DO_SERVIDOR_MONITORADO -k "tcp_services"

例如

[root@canghai bin]# ./zabbix_get -s 192.168.1.10  -k "tcp_services"
{
    "data": [
        {
            "{#PROCNAME}": "Master",
            "{#PORT}": 25
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 24224
        },
        {
            "{#PROCNAME}": "Zabbix_agentd",
            "{#PORT}": 10050
        },
        {
            "{#PROCNAME}": "Zabbix_proxy",
            "{#PORT}": 10051
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 24230
        },
        {
            "{#PROCNAME}": "Snmpd",
            "{#PORT}": 199
        },
        {
            "{#PROCNAME}": "Svnserve (Deleted)",
            "{#PORT}": 3690
        },
        {
            "{#PROCNAME}": "Nginx",
            "{#PORT}": 80
        },
        {
            "{#PROCNAME}": "Sshd",
            "{#PORT}": 22
        },
        {
            "{#PROCNAME}": "Ruby",
            "{#PORT}": 8888
        }
    ]
}

如返回数据说明没有问题,不返回则说明 zabbix_agentd 或者 tcp_service 有问题。

模版&tcp_services(Linux_x32&x64)下载:zabbix_tcp_services.tar.gz

此文为参考老外文章,经测试udp_serivces服务提取为空。老外原文地址:autodiscovery-servicos-linux-zabbix