Zabbix Docker 部署
具体原理可参考博主所述 https://www.cnblogs.com/Dy1an/ ,如下所示例图:

配置环境
因防火墙和selinux的开启,会影响到后面Zabbix断续连接的情况;
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config //永久
setenforce 0 //临时
安装Docker-Ce
详细教程请查看 Docker 部署,在此不再细说;
部署 Zabbix
配置 Zabbix-Server
- MySQL:采用 5.7 版本,可直接建立 zabbix表及账密,在此为了方便管理,统一建立新的;
- Gateway:Java网关,非必要安装,为了方便以后扩展,先建立起连接;
- Server:Zabbix-Server-Mysql分了不同版本,为了后面Python能正常安装,建议选择熟手的Tag,在此选用的是centos-latest
- Nginx:前端界面,用于映射Server后端程序;
- Agent:客户端,非必要安装,如需要监控 Zabbix-Server 可进行部署
MySQL
# 采用Mysql 5.7进行存放数据,如需保留配置建议作数据持久化;
$ docker run --name zabbix-mysql -t \
--restart always \
--privileged=true \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-v /etc/localtime:/etc/localtime:ro \
-p 3366:3306 \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
Gateway
# 默认端口10052
$ docker run --name zabbix-gateway -t \
-v /etc/localtime:/etc/localtime:ro \
--restart always \
--privileged=true \
-d zabbix/zabbix-java-gateway:latest
Server
# Tag 版本可自先选择,详细请到 docker hub 查看
$ docker run --name zabbix-server -t \
-e DB_SERVER_HOST="zabbix-mysql" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-gateway" \
-v /etc/localtime:/etc/localtime:ro \
--link zabbix-mysql:mysql \
--link zabbix-gateway:zabbix-gateway \
-p 10051:10051 \
--restart always \
--privileged=true \
-d zabbix/zabbix-server-mysql:centos-latest
Nginx
$ docker run --name zabbix-nginx -t \
-e DB_SERVER_HOST="zabbix-mysql" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e PHP_TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
--link zabbix-mysql:mysql \
--link zabbix-server:zabbix-server \
-p 8082:8080 \
--restart always \
--privileged=true \
-d zabbix/zabbix-web-nginx-mysql:latest
除了每个容器加上 -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime 参数后,进容器查看时间/时区是对的。
但 Zabbix 的服务器时间还是不对,在这需要在 zabbix/zabbix-web-nginx-mysql:latest 容器上加一个启动参数 -e PHP_TZ="Asia/Shanghai",主要针对 php 的时间配置。
Agent
注:因采用 Docker 并使用的是bridge,因此无法获取宿主机地址,会提示权限问题,需要使用Agent容器地址
$ docker run --name zabbix-agent \
--link zabbix-server:zabbix-server \
-e ZBX_SERVER_HOST="zabbix-server" \
-e ZBX_SERVER_PORT=10051 \
-e ZBX_HOSTNAME="Zabbix server" \
-p 10050:10050 \
-v /etc/localtime:/etc/localtime:ro \
-d zabbix/zabbix-agent
浏览器查看效果 http://188.188.2.30:8082 默认登录账号Admin 密码zabbix

Server-Agent 容器已开启,需要到'配置'-'主机'-'Zabbix Server'-将127.0.0.1改为Agent容器地址172.17.0.8
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3af7cc1b5d61 zabbix/zabbix-agent "/sbin/tini -- /usr/…" 5 hours ago Up 5 hours 0.0.0.0:10050->10050/tcp zabbix-agent
//查看端口使用情况
$ iptables -nL
......
Chain DOCKER (6 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.8 tcp dpt:10050
ACCEPT tcp -- 0.0.0.0/0 172.17.0.6 tcp dpt:10051
进到 Zabbix Server 的容器中,测试是否获取agent系统信息
$ docker exec -it {zabbix server-id} /bin/bash
bash-5.0$ /usr/bin/zabbix_get -s {zabbix agent-ip} -p 10050 -k system.uname
Linux c253531d4c9b 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64

配置 Zabbix-Agnet
注意事项:
- ZBX_HOSTNAME 必须与Zabbix设置的主机名称一致;
- ZBX_SERVER_HOST 填写的为 Zabbix-Server 的IP地址;
- 端口10050 防火墙须作开放处理,如出现断续情况需要关闭Selinux
Linux
先配置防火墙等安全设置,开放10050端口,启用容器后在Web界面-管理添加主机并配置监控模版(生效约为1分钟)
//防火墙开放端口
$ firewall-cmd --permanent --zone=public --add-port=10050/tcp //永久
//关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config //永久
$ docker run --name zabbix-agent \
-e ZBX_HOSTNAME='CS-Server' \
-e ZBX_SERVER_HOST=188.188.2.30 \
-v /etc/localtime:/etc/localtime:ro \
-d -p 10050:10050 \
--restart always \
--privileged=true \
zabbix/zabbix-agen


Window
下载zabbix_agentd监控客户端软件安装包(windows操作系统客户端)
下载直达:https://www.zabbix.com/cn/download_agents
版本有两种,一种为MSI直装方式,另一种为脚本配置,在此为了方便解析,使用的是脚本方式;

脚本方式
解压后有两个文档,bin存放的为启动程序,conf为配置文件

修改配置文件
EnableRemoteCommands=1 //允许在本地执行远程命令
LogRemoteCommands=1 //执行远程命令是否保存操作日志
Server = 188.188.2.30 //填写zabbix服务器IP地址
ServerActive=188.188.2.30 //填写zabbix服务器IP地址-主动发现模式(非必要)
Hostname=DC.smart-team.cn //zabbix_agent客户端计算机名或IP地址 (被监控主机)

启动程序
桌面 ----> 开始 ----> 运行 -----> 输入cmd 打开DOS命令窗口---->输入以下两条命令进行zabbix客户端安装。(必须要以管理员身份运行打开DOS命令窗口),结果显示 started successfully 代表正常
# 安装zabbix客户端
C:\zabbix_agent\bin\zabbix_agentd.exe -i -c C:\zabbix_agent\conf\zabbix_agentd.conf
# 启动zabbix服务
C:\zabbix_agent\bin\zabbix_agentd.exe -s -c C:\zabbix_agent\conf\zabbix_agentd.conf
注释:
-c:指定配置文件位置
-i:安装agent
-s:启动agent
-x:停止agent
-d:卸载agent
成功后系统服务会增加一条 Zabbix Agent 的服务项

防火墙的出入规则需要开放10050端口(注意出入规则都需要配置)

安装msi方式

到达Web界面-管理配置主机名称、地址及设置模版


钉钉报警
python安装及配置
在此引申个小插曲,一开始在旧版本的 zabbix 默认是无 python 环境的。但在新版本的 Zabbix-Server,经过一番操作后才发已默认安装了 Python3,在此建议操作前先行查看下是否有 Python 环境,而我为什么一开始没发现,原因在于容器内没作软链接, python --version 提示 python:command not found。在此以无 Python 的前提下为例实操;Zabbix-Server 先行安装 epel-release/python/pip/requests,再配置脚本触发;
$ docker exec -it -u root zabbix-server bash //使用root进入才能进行安装,否则权限不足
$ yum -y install wget
$ yum -y install vim
$ yum install epel-release
$ dnf install python2
# 其实使用 python2 --version 也代表成功的。但后续触发动作还是会报错下述,因此需要调环境变量;
# Cannot execute command "/usr/lib/zabbix/alertscripts/dingding.py": [2] No such file or directory
$ ln -s /usr/bin/python2.7 /usr/bin/python
$ python --version
Python 2.7.17
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
$ pip --version
pip 20.2.3 from /usr/lib/python2.7/site-packages/pip (python 2.7)
$ pip install requests
创建脚本并配置
首先钉钉机器人只有在群聊之中才可以创建,所以你就需要创建一个钉钉群,首先你创建一个三个人的群聊,创建完成之后把别人踢出去就可以了,这样就是你和钉钉机器人两个人的群聊,之后在电脑上获取钉钉机器人的webhook备用
$ cd /usr/lib/zabbix/alertscripts
$ cat dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXX"
def msg(text):
json_text= {
"msgtype": "text",
"at": {
"atMobiles": [
"钉钉号码"
],
"isAtAll": False
},
"text": {
"content": text
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
//添加可执行权限
$ chmod +x dingding.py
//测试是否成功
$ python dingding.py test 135XXXX4846 "这个条测试信息,忽略"
api_url就是钉钉机器人webhook地址,之后把这个脚本放到机器的alertscripts目录下面具体路径为 /usr/lib/zabbix/alertscripts

创建报警媒介


配置用户
之后点击管理->用户->选择你要告警的用户,这里直接创建message用户了 选择报警媒介,权限问题必须为管理员,收件人填写钉钉用户电话


配置动作
最后我们配置动作,点击配置-> 动作->创建动作 (可以按不同条件添加触发)

名称随便写,点击触发器名称选择触发器警示度,之后选择大于等于警告,接着选择添加,点击一起用
配置操作
在此配置操作分为三种类型:故障触发、恢复触发、确认触发,操作细节选择发送消息,群组和用户选择你要发送消息的群组和用户点击添加
故障触发
故障触发可适当增加条件进行判断;
主题
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
消息
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}

恢复触发
主题
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
消息
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
确认触发
主题
服务器:{HOST.NAME}: 报警确认
消息
确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:"{ACK.MESSAGE}"
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}
测试
最后就是测试环节,停掉监控的任何一个主机的zabbix-agent进程,之后我们看有没有收到报警信息,如果没有,可以登录数据库查看alerts表里面error字段信息



浙公网安备 33010602011771号