====

架构概览

网络环境:四朵独立的云,中间通过防火墙隔离,需要搭建一套监控系统对全网的网络设备进行监控,通过 Zabbix Server + Proxy 分布式部署方式来实现。

版本选择

截止目前,Zabbix 已经发布了 6.0 pre-release,稳定版也已经来到了 5.4。

在生产环境部署时,为稳定起见,建议使用 Long-term support (LTS) 版本。

本次部署选用的是 Zabbix 5.0 LTS 版本。

版本及软件依赖

存储空间要求:

  • 历史数据:(监控项/刷新周期) * days * 24 * 3600 * 单条数据大小(约为50B)
  • 趋势数据:(监控项/3600) * days * 24 * 3600 * 单条大小(约128B)
  • 事件数据:每秒事件数 * days * 24 * 3600 * 单条大小(约130B)

硬件性能

NamePlatformCPU/MemoryDatabaseMonitored hosts
SmallCentOSVirtual ApplianceMySQL InnoDB100
MediumCentOS2 CPU cores/2GBMySQL InnoDB500
LargeRedHat Enterprise Linux4 CPU cores/8GBRAID10 MySQL InnoDB or PostgreSQL>1000
Very largeRedHat Enterprise Linux8 CPU cores/16GBFast RAID10 MySQL InnoDB or PostgreSQL>10000

Zabbix 硬件性能取决于监控项(主动)的数量和更新间隔,数量越多需要的性能就越高。

前置条件

  1. 安装 Docker,可参考阿里云镜像站:https://developer.aliyun.com/mirror/docker-ce

  2. Docker 镜像加速(拉取镜像时默认从 Docker hub 进行拉取,国内网络速度较慢,可更换为国内源提高访问速度):

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

使用 docker info 命令查看国内镜像配置是否生效:

image-20211228232224039

本文使用的 Docker 版本:

docker --version
Docker version 20.10.12, build e91ed57

镜像准备

根据 Zabbix 架构图,需要拉取如下几个镜像:

docker pull zabbix/zabbix-web-nginx-mysql:5.0-centos-latest
docker pull zabbix/zabbix-server-mysql:5.0-centos-latest
docker pull zabbix/zabbix-proxy-mysql:5.0-centos-latest
docker pull zabbix/zabbix-snmptraps:5.0-centos-latest
docker pull zabbix/zabbix-agent:5.0-centos-latest
docker pull mysql:5.7

镜像拉取完成后,可以通过 docker images 查看镜像列表。

image-20211228232758646

运行 Demo

通过 Docker 搭建一个最小化版本的 Zabbix,如果想体验基本功能,安装 MySQL、Server、Web、Agent 即可,本例中也添加了 Proxy,运行如下命令,即可快速搭建完成一个 Zabbix 监控平台。

# 运行本地数据库
docker run --name zbx5-mysql -d \
    --network=host \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e MYSQL_ROOT_PASSWORD="root" \
    --restart unless-stopped mysql:5.7 \
    --character-set-server=utf8 --collation-server=utf8_bin \
    --default-authentication-plugin=mysql_native_password

# 启动 server 后端
docker run --name zbx5-server-mysql -d \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e MYSQL_ROOT_PASSWORD="root" \
    --network=host \
    --restart unless-stopped \
	zabbix/zabbix-server-mysql:5.0-centos-latest

# 启动 proxy,由于默认 Server 和 Proxy 端口都为 10051,避免冲突,这里使用 11111
docker run --name zbx5-proxy-mysql -d \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e ZBX_LISTENPORT=11111 \
    -e ZBX_HOSTNAME="zabbix-proxy-test1" \
    -e ZBX_SERVER_HOST="127.0.0.1" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
	-e MYSQL_ROOT_PASSWORD="root" \
    --network=host \
    --restart unless-stopped \
	zabbix/zabbix-proxy-mysql:5.0-centos-latest

# 启动前端页面,默认端口是 8080
docker run --name zbx5-web-nginx-mysql -d \
    -e ZBX_SERVER_HOST="127.0.0.1" \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e MYSQL_ROOT_PASSWORD="root" \
    --network=host \
    --restart unless-stopped \
	zabbix/zabbix-web-nginx-mysql:5.0-centos-latest

# 启动 Agent
docker run --name zbx5-agent -d \
    -e ZBX_HOSTNAME="local-agent" \
    -e ZBX_SERVER_HOST="127.0.0.1"  \
    --network=host \
    --restart unless-stopped \
    zabbix/zabbix-agent:5.0-centos-latest

启动完成后,通过 docker ps 查看所有容器已经正在运行,之后通过访问 http://ip:8080 即可访问!

默认用户名/密码是:Admin/zabbix

image-20211229203922391

生产环境部署

网络模式

默认情况下,容器的网卡都是经过 NAT 的,为了保证相关服务可以正常被外部访问,容器都使用主机模式的网络(--network=host),即端口连接、端口监听都使用物理机的地址。

数据库

如果已经有现成的数据库,则不用使用本地数据库,直接配置指定远程数据库即可。

Zabbix 支持 MySQL、PostgreSQL 等,使用不同后端数据库,需要选择对应的 Zabbix 容器镜像。

以下为本地使用容器搭建 MySQL 示例(对上文 Demo 的解释):

docker run --name zbx5-mysql -td \
    --network=host \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e MYSQL_ROOT_PASSWORD="root" \
    --restart unless-stopped mysql:5.7 \
    --character-set-server=utf8 --collation-server=utf8_bin \
    --default-authentication-plugin=mysql_native_password

运行之后,一个本地数据库就搭建完成了,之后可以在 Linux 中使用 docker exec -it zbx5-mysql mysql -proot 来连接到本地数据库,其中 MYSQL_DATABASE 为新建的数据库,MYSQL_ROOT_PASSWORD 为数据库超级管理员 root 的密码**(生产环境中请使用符合密码策略的强密码)**。

image-20211229002522793

目录梳理

由于 Docker 不能完成数据持久化(删除容器后即丢失),并且多个容器之间存在共享目录或者文件的情况(例如:snmptraps 写 log,Server 读 log),所以需要把配置文件、数据文件等放在本地,并使用 volume 映射到 Docker 中读取。

Docker 挂载本地目录时,使用 -v $hostDir:$containerDir 参数。

每个容器镜像都给出了允许挂载的目录卷,可查阅 Docker Hub 上对应的镜像主页说明。Zabbix docker 镜像主页MySQL docker 镜像主页

本次部署选择将所有组件需要的目录统一放到 /opt/zabbix-volumes/ 下,分为:

  • snmp:存放 snmp 相关的配置文件(snmptraps 需要)
  • zabbix-data:Zabbix Server/Proxy 数据文件,如自定义脚本、模块、mib文件等
  • zabbix_proxy.conf.d:自定义 proxy 配置文件
  • zabbix_server.conf.d:自定义 server 配置文件

以上目录可以直接从已有的 demo 环境中获取到:

mkdir -p /opt/zabbix-volumes/ && cd /opt/zabbix-volumes/
# server 和 proxy 目录基本一致
docker cp zbx5-server-mysql:/var/lib/zabbix/ ./zabbix-data/
docker cp zbx5-snmptraps:/etc/snmp .
# snmptrap 处理脚本(默认)
docker cp zbx5-snmptraps:/usr/sbin/zabbix_trap_handler.sh ./snmp
mkdir -p zabbix-data/alertscripts
mkdir -p zabbix-data/externalscripts
mkdir -p zabbix-data/export

最后目录结构如下:

 # tree
.
├── snmp
│   ├── snmpd.conf
│   ├── snmptrapd.conf
│   └── zabbix_trap_handler.sh
├── zabbix-data
│   ├── alertscripts
│   ├── enc
│   ├── export
│   ├── externalscripts
│   ├── mibs
│   ├── modules
│   ├── snmptraps
│   ├── ssh_keys
│   └── ssl
│       ├── certs
│       ├── keys
│       └── ssl_ca
├── zabbix_proxy.conf.d
└── zabbix_server.conf.d

16 directories, 3 files

参数/环境变量

在容器内服务运行的时候如果需要传递参数,可以使用 -e 选项来指定。如指定数据库的用户名:docker run ... -e MYSQL_USER="zabbix" ...

看容器支持的每个参数及其含义,可查阅 Docker Hub 上对应的镜像主页说明。Zabbix docker 镜像主页MySQL docker 镜像主页

每个 Docker 镜像都支持若干自定义参数,如果不传参的话,使用的就是是默认参数,官方镜像支持配置文件中的全部参数。

使用 -e 传参后, docker 启动时会逐个进行写入,见下文图中 ** Updating '/etc/zabbix/zabbix_server.conf' parameter....,最终会生成一份完整的配置文件。

这样的话会有一个问题:官方的镜像支持了上百个参数,如果要对运行中的 Zabbix 容器进行参数调整,使用 -e 指定参数启动容器后,要想调整只能把容器删除后再重新启动新的容器,可维护性不高(个人理解,如有更好的思路进行交流~)。

通过查看配置文件,可以使用 Include 参数将其他文件或目录包含在 Server/Proxy/Agent 的配置中,实现自定义加载配置文件;这样只需要以最小化配置启动容器,自定义配置通过单独的文件加载,之后热加载或者重启容器即可使新的配置文件生效,也便于维护。

官方镜像中并未提供 Include 参数的配置及更新,所以需要在官方镜像基础上重新打包,使其支持 Include 参数。

自定义 Zabbix Server 镜像

最小化运行 Zabbix Server 端,运行时需要指定数据库的地址(必选参数),以保证数据可以正常存取。

docker run --name zbx5-server-mysql -t \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e MYSQL_ROOT_PASSWORD="root" \
    -e ZBX_ENABLE_SNMP_TRAPS=true \
    --network=host \
    --restart unless-stopped \
    -d zabbix/zabbix-server-mysql:5.0-centos-latest

运行完成之后,通过 docker logs ${docker_id} 可以看到运行日志,首先进行了数据库的初始化,之后写入配置文件,最后启动 Server 端。

如果是已有数据库已有数据表,则不会再次进行初始化。

image-20211229015713693

运行成功后,将原始容器的启动脚本拷贝出来进行修改。

cd ~
mkdir docker-build/zbx_server -p
docker cp zbx5-server-mysql:/usr/bin/docker-entrypoint.sh ./docker-build/zbx_server
cd docker-build/zbx_server

编辑原始启动文件:

# vim docker-entrypoint.sh
# 移动到 440 行左右,这里的配置就是调用函数更新配置,在这里添加需要的 `Include` 参数
...
    update_config_var $ZBX_CONFIG "Include" "${ZBX_INCLUDE}"
...

image-20211229112406476

编辑 Dockerfile,制作新的镜像:

# cat Dockerfile
FROM zabbix/zabbix-server-mysql:5.0-centos-latest
COPY ./docker-entrypoint.sh /usr/bin/docker-entrypoint.sh

image-20211229112709803

重新打包镜像:

# 使用当前目录的 Dockerfile 创建镜像,新镜像标签为 xdai/zabbix-server-mysql:v1
docker build -t xdai/zabbix-server-mysql:v1 .

image-20211229113707531

之后使用 v1 这个版本的镜像启动时,就可以支持 Include 参数了。

自定义 Zabbix Proxy 镜像

原理同上。

# 启动 Proxy 容器,因为测试环境 Proxy 和 Server 在同一台机器上启动,端口无法重用,所以指定监听端口为 11111
docker run --name zbx5-proxy-mysql -t \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e ZBX_LISTENPORT=11111 \
    -e ZBX_HOSTNAME="zabbix-proxy-test1" \
    -e ZBX_SERVER_HOST="127.0.0.1" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
	-e MYSQL_ROOT_PASSWORD="root" \
    --network=host \
    --restart unless-stopped \
    -d zabbix/zabbix-proxy-mysql:5.0-centos-latest

运行成功后,将原始容器的启动脚本拷贝出来进行修改。

cd ~
mkdir docker-build/zbx_proxy -p
docker cp zbx5-proxy-mysql:/usr/bin/docker-entrypoint.sh ./docker-build/zbx_proxy
cd docker-build/zbx_proxy

编辑原始启动文件:

# vim docker-entrypoint.sh
# 移动到 440 行左右,这里的配置就是调用函数更新配置,在这里添加需要的 `Include` 参数
...
    update_config_var $ZBX_CONFIG "Include" "${ZBX_INCLUDE}"
...

编辑 Dockerfile,制作新的镜像:

# cat Dockerfile
FROM zabbix/zabbix-proxy-mysql:5.0-centos-latest
COPY ./docker-entrypoint.sh /usr/bin/docker-entrypoint.sh

重新打包镜像:

# 使用当前目录的 Dockerfile 创建镜像,新镜像标签为 xdai/zabbix-proxy-mysql:v1
docker build -t xdai/zabbix-proxy-mysql:v1 .
自定义 Agent 镜像

同上,略略略~

开始部署

!!!如果在同一台设备上,部署前需要删除之前的 demo 环境,以免冲突。

以下内容均已在生产环境验证稳定运行,目前通过 Zabbix SNMP 监控网络设备(总计 400+ 带内网络设备,总计监控项 25w+)及 Agent 监控少量 Linux 服务器。

自定义配置均为实践踩坑所得优化参数。

后端数据库

同上文数据库一节,Server 采用 RDS 的方式远程连接,本例中使用本地数据库;Proxy 由于是临时数据存储,故使用本地数据库。

如果在 Server/Proxy 的自定义配置文件中调整了参数,更多的进程意味着需要更多的数据库连接,所以默认的连接数不够多,可能会造成容器异常退出,所以需要调整本地数据库的默认连接数。

连接数异常报错信息(通过 docker logs zbx-server-mysql查看):

 ...
 385:20211229:152438.049 [Z3001] connection to database 'zabbix' failed: [1040] Too many connections
   385:20211229:152438.049 Cannot connect to the database. Exiting...
...

修改连接数:

# 登录数据库
docker exec -it zbx5-mysql mysql -uroot -proot
# 查看最大连接数
mysql> show variables like "%max_connections%";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
# 查看服务器响应的最大连接数
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 152   |
+----------------------+-------+
# 修改最大连接数(重启容器后会失效!)
mysql> set global max_connections = 1000;
Query OK, 0 rows affected (0.01 sec)

如果想要数据库的配置持久化,需要修改 MySQL 配置文件信息,参考:

# 以本例中的 mysql 容器为例(基于 Ubuntu),永久修改最大连接数
# 进入容器
docker exec -it zbx5-mysql bash
# 添加配置文件,修改最大连接数为 10000
echo "max_connections = 10000"  >> /etc/mysql/mysql.conf.d/mysqld.cnf
# 退出容器
exit
# 重启容器
mysql docker restart zbx5-mysql
# 查看配置已经生效
docker exec -it zbx5-mysql mysql -uroot -proot -e 'show variables like "%max_connections%"' 
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
Server 后端

Server 端的自定义配置文件如下:

# vim zabbix_server.conf.d/custom.conf
StartPollers=200
StartPreprocessors=50
StartPollersUnreachable=30
StartTrappers=50
StartPingers=30
StartLLDProcessors=30
StartDiscoverers=10
StartAlerters=5
CacheSize=1024M
HistoryCacheSize=512M
HistoryIndexCacheSize=512M
TrendCacheSize=512M
ValueCacheSize=512M
StartProxyPollers=5
Timeout=30
ProxyConfigFrequency=60

将配置文件放在自定义配置目录下,挂载对应的数据卷,启动容器。

docker run --name zabbix-server -d \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e ZBX_ENABLE_SNMP_TRAPS=true \
    -e ZBX_INCLUDE="/etc/zabbix/zabbix_server.conf.d/*.conf" \
    --network=host \
    -v /opt/zabbix-volumes/zabbix_server.conf.d:/etc/zabbix/zabbix_server.conf.d \
    -v /opt/zabbix-volumes/zabbix-data:/var/lib/zabbix \
    -v /opt/zabbix-volumes/zabbix-data:/usr/lib/zabbix \
    -v /opt/zabbix-volumes/zabbix-data/export:/var/lib/zabbix/export \
    -v /opt/zabbix-volumes/zabbix-data/snmptraps:/var/lib/zabbix/snmptraps \
	-v /etc/localtime:/etc/localtime \
    --restart unless-stopped \
    xdai/zabbix-server-mysql:v1

参数解释:

  • --restart unless-stopped:除非手动 stop 容器,否则容器退出后会不断尝试拉起
  • -v /etc/localtime:/etc/localtime:保持和本机时区同步
  • -e ZBX_ENABLE_SNMP_TRAPS=true:开启后,从 snmptraps.log 读取 trap 信息
Web 前端

Zabbix 前端通过 PHP 来实现,默认只提供了通过参数的方式修改配置,如果需要自定义配置文件,可以参考上文重新制作镜像。

启动前端容器,如果数据库和 Server 端不在同一台服务器上,注意修改对应参数:

docker run --name zabbix-web -d \
    -e ZBX_SERVER_HOST="127.0.0.1" \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e PHP_TZ="Asia/Shanghai" \
    --network=host \
	-v /etc/localtime:/etc/localtime \
    --restart unless-stopped \
    zabbix/zabbix-web-nginx-mysql:5.0-centos-latest

参数解释:

  • -e PHP_TZ="Asia/Shanghai:设置时区为上海。

默认端口为 8080,前端容器正常启动后,即可进行访问。

内存占用过高的问题

运行一段时间之后,发现服务器内存被占满,通过查看进程,发现是 php-fpm 相关进程有多个,平均每个占用了 1G,在容器内修改配置文件控制一下进程数量:

# php 内存占用过高
# /etc/php-fpm.d/zabbix.conf
pm = dynamic
pm. start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 8

参数解释:

pm = dynamic 如何控制子进程,选项有static和dynamic    
pm.max_children:静态方式下开启的php-fpm进程数量    
pm.max_requests:php-fpm子进程能处理的最大请求数    
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量
切换中文后,图形上面显示乱码的问题

默认的字体没有汉语字符集,直接替换字体即可(也可以直接自定义镜像)。

首先下载一个字体,这里使用的是文泉驿微米黑字体,下载之后覆盖容器内的字体即可。

docker cp /tmp/wqy-microhei.tto zabbix-web:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf

小米新发布的字体也不错,支持十种字重,下载地址:MiSans

Proxy

关于 Proxy 的信息可直接查看官网,有非常详尽的说明:Proxy 概述,以下为摘抄:

  • 主动模式:主动模式下的 Zabbix proxy 会主动连接到 Zabbix server 并请求配置数据。前端添加时不需要指定端口,只需要 Proxy 配置的名字和 Server 端添加的名字一致即可(用于判断哪个 Proxy 连上来了)。

  • 被动模式:需要 Server 端主动连到 Proxy 上,所以添加时需要提供端口信息,配置文件从本地读取。

  • Zabbix proxy 到 Zabbix server 只需要一条 tcp 连接,仅在防火墙上配置一条规则即可。

  • Proxy 收集的所有数据在传输到服务器之前都存储在本地。这样就不会因与服务器的任何临时通信问题而丢失任何数据。当它把对应的数据发送给 Zabbix server 以后,本地临时存储的数据就会清除

  • 代理配置文件中的 ProxyLocalBuffer 和 ProxyOfflineBuffer 参数控制数据在本地保留的时间。

  • 基于上述,Proxy 的数据库和 Server 的数据库一定要分开,否则会造成数据错乱或丢失。

由于我们生产环境中网络因素(不可抗力),仅能使用 proxy 被动模式来部署。

Proxy 端的自定义配置文件如下:

# vim zabbix_proxy.conf.d/custom.conf
EnableRemoteCommands=1
ProxyOfflineBuffer=240
StartPollers=50
StartDiscoverers=10
StartPreprocessors=20
StartPollersUnreachable=10
StartPingers=10
CacheSize=1024M
HistoryCacheSize=512M
HistoryIndexCacheSize=512M
Timeout=30

将配置文件放在自定义配置目录下,挂载对应的数据卷,启动容器。

docker run --name zabbix-proxy -d \
    -e DB_SERVER_HOST="127.0.0.1" \
    -e ZBX_LISTENPORT=11111 \
    -e ZBX_PROXYMODE=1 \
    -e ZBX_HOSTNAME="zabbix-proxy-test" \
    -e ZBX_SERVER_HOST="127.0.0.1" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix" \
    -e ZBX_ENABLE_SNMP_TRAPS=true \
    -e ZBX_INCLUDE="/etc/zabbix/zabbix_proxy.conf.d/*.conf" \
    --network=host \
    -v /opt/zabbix-volumes/zabbix_proxy.conf.d:/etc/zabbix/zabbix_proxy.conf.d \
    -v /opt/zabbix-volumes/zabbix-data:/var/lib/zabbix \
    -v /opt/zabbix-volumes/zabbix-data/snmptraps:/var/lib/zabbix/snmptraps \
    -v /etc/localtime:/etc/localtime \
    --restart unless-stopped \
    xdai/zabbix-proxy-mysql:v1

Proxy 启动后,可以在前端 Web 上进行添加测试一下。

被动模式,端口 11111。

image-20211230005830309

添加成功后,上次在线时间(Last seen)会一直重置为 0,表示 Proxy 可被正常检测到。

image-20211230010013164
Agent

Zabbix Server 端启动后,会默认监控本机的 10050 端口(zabbix_agent 端口)来对本机进行监控,如果没有运行 agent,系统会提示该主机离线。

image-20211230010402200

启动 Agent 容器,本机监控一般不需要额外的参数:

docker run --name zabbix-agent -d \
    -e ZBX_HOSTNAME="local-agent" \
    -e ZBX_SERVER_HOST="127.0.0.1"  \
    --network=host \
    -v /etc/localtime:/etc/localtime \
    --restart unless-stopped \
    zabbix/zabbix-agent:5.0-centos-latest

Agent 端启动后,Web 上可以看到本机状态恢复正常。

image-20211230010908510
SNMPTraps

如果使用的 SNMPv3 版本,需要把每台网络设备的信息都录入进去,主要是 engine-id 不同;SNMPv2版本只需要写上只读只写的团体字即可。

SNMPTrap 的配置文件如下,配置文件的编写参考 net-snmp

snmpTrapdAddr udp:1162
# Start
# createUser -e ENGINEID myuser SHA "my authentication pass" AES "my encryption pass"
createUser -e 800063A2805E9B20F2010000000001 snmpv3user MD5 snmpv3pw
# End
authUser log,execute snmpv3user
disableAuthorization no

获取 snmp engine-id 的两种方法:

  • 登录交换机查看配置
  • 使用 snmpwalk 命令查询 OID:snmpwalk -v 3 -u snmpv3user -a md5 -A snmpv3pw -l authNoPriv ${网络设备地址} 1.3.6.1.6.3.10.2.1.1.0

如果设备较多,可以使用 for 循环批量获取,以下脚本供参考:

#!/usr/bin/env python2
import commands

CONF_TMPL = "createUser -e %s snmpv3user MD5 snmpv3pw\n"
OID = "1.3.6.1.6.3.10.2.1.1.0"
# 读取设备 IP 列表文件,获取 IP 列表信息
with open ("ip_list", "r") as f:
    ip_list = f.readlines()
# 打开配置文件句柄
snmptrap_conf_file = open("snmptraped.conf", "w+")
# 循环获取 engine_id 并写入配置文件
for ip in ip_list:
    cmd = "snmpwalk -v 3 -u snmpv3user -a md5 -A snmpv3pw -l authNoPriv %s %s" %(ip.strip(), OID)
    engine_id = commands.getoutput(cmd).split("=")[1].split(":")[1].replace(" ","")
    snmptrap_conf_file.write(CONF_TMPL % (engine_id))
# 关闭配置文件句柄
snmptrap_conf_file.close()

启动 SNMPTraps 容器,这里需要注意:snmptraps 容器需要和 server/proxy 容器共享同一个 snmptraps 目录,并且需要使用 root 用户启动(--privileged=true)。

docker run --name snmptraps -d \
    -v /opt/zabbix-volumes/snmp:/etc/snmp \
    -v /opt/zabbix-volumes/zabbix-data:/var/lib/zabbix \
    -v /opt/zabbix-volumes/zabbix-data/snmptraps:/var/lib/zabbix/snmptraps \
    --network=host \
    --restart unless-stopped \
    -v /etc/localtime:/etc/localtime \
    --privileged=true \
    zabbix/zabbix-snmptraps:5.0-centos-latest
网络设备配置

以 H3C 交换机配置 SNMMPv3 为例:

# snmp 配置
snmp-agent
snmp-agent sys-info version v3
snmp-agent group v3 snmpv3group authentication read-view iso-ivew write-view iso-view notify-view iso-view
snmp-agent mib-view included iso-view iso
snmp-agent usm-user v3 snmpv3user snmpv3group simple authentication-mode md5 snmpv3pw
# trap 配置
snmp-agent trap enable
snmp-agent trap periodical-interval 0
snmp-agent trap source LoopBack1
# x.x.x.x 为 zabbix server/proxy 地址,运行 snmptraps 容器的服务器
snmp-agent target-host trap address udp-domain x.x.x.x params securityname snmpuv3user v3 authentication
undo snmp-agent trap enable syslog

总结

到这 Zabbbix 平台就搭建完成了,后面就需要添加主机、配置监控项等操作。

关于使用方法,可参考官方文档,后面有时间也会做一些分享。

本文是对生产环境部署 Zabbix 平台的事后回顾记录,目前已经稳定运行约一年。由于是内网环境无法联网,一些细节改动不便分享。。。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐