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字段信息

posted @ 2020-12-11 15:24  YuiKuen_Yuen  阅读(773)  评论(0)    收藏  举报