一、zabbix的构架信息

1.1 zabbix-server

zabbix 的server 端,负责接受zabbix-agent的监控数据,并且提供各种zabbix 的监控功能

1.2 database

用户存储zabbix-agent,或者代理层的数据,本文只使用mysql

1.3 zabbix-web

zabbix 的web端,用户监控的展示和一些监控的配置

1.4 zabbix-java-gateway

用户监控jave 的jvm 的详细信息,zabbix 自身无法监控jvm的监控指标。需要通过网关来实现

1.5 zabbix-agent

zabbix 的代理端,收集主机上的监控数据,并发送zabbix 的服务端

1.6 zabbix_proxy

用于zabbix-agent 发送数据,最终发送zabbix-server,可以减轻zabbix-server的负载压力

二、安装zabbix各个组件

2.1 为zabbix 组件容器创建专用网络

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

2.2 安装mysql8创建zabbix数据存储

docker run --name zabbix-mysql -it -v /zabbixx/mysql/conf/:/etc/mysql/my.cnf -v /zabbixx/mysql/data:/var/lib/mysql -v /zabbixx/mysql/logs:/var/log/mysql -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbixB@Ba1" -e MYSQL_ROOT_PASSWORD="bobo1@Aa" -e TZ="Asia/Shanghai" -e ZBX_DBTLSCONNECT="required" --network=zabbix-net --ip=172.20.200.1 -p 3306:3306 --restart=always --privileged=true -d mysql:8.0.31 --character-set-server=utf8 --collation-server=utf8_bin

2.3 安装zabbix-java-gateway用户监控jvm(没有java监控,可以不用安装)

docker run --name zabbix-java-gateway -t -e TZ="Asia/Shanghai" --network=zabbix-net --ip=172.20.200.2 --restart=always --privileged=true -d zabbix/zabbix-java-gateway

2.4 安装zabbix-server 组件并连接上面安装的mysql

docker run --name zabbix-server-mysql -t -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbixB@Ba1" -e MYSQL_ROOT_PASSWORD="bobo1@Aa" -e ZBX_JAVAGATEWAY="zabbix-java-gateway" -e TZ="Asia/Shanghai" --network=zabbix-net --ip=172.20.200.3 -p 10051:10051 --restart=always --privileged=true -d zabbix/zabbix-server-mysql

2.5 安装zabbix-web 组件并链接mysql 和zabbix-server

docker run --name zabbix-web-nginx-mysql -t -e ZBX_SERVER_HOST="zabbix-server-mysql" -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbixB@Ba1" -e MYSQL_ROOT_PASSWORD="bobo1@Aa" -e TZ="Asia/Shanghai" -e PHP_TZ="Asia/shanghai" --network=zabbix-net --ip=172.20.240.4 -p 10000:8080 --restart=always --privileged=true -d zabbix/zabbix-web-nginx-mysql

2.6 安装zabbix-proxy 组件链接zabbix-server

docker run --name zabbix-proxy -t -e DB_SERVER_HOST="172.20.*.*" -e ZBX_SERVER_HOST="172.20.*.*" -e MYSQL_USER="zabbix" -e MYSQL_DATABASE="zabbix" -e MYSQL_PASSWORD="zBeG@Aa1" -e ZBX_HOSTNAME="zabbix-proxy-guanzhong" -e ZBX_TIMEOUT=30 -e ZBX_CACHESIZE=5000M -v /etc/localtime:/etc/localtime -p 10051:10051 -d zabbix/zabbix-proxy-mysql:latest

zabbix-proxy 文件具体内容

Server=172.20.*.*

ServerPort=10051

Hostname=zabbix-proxy-guanzhong

LogType=console

DBHost=172.20.*.*

DBName=zabbix

DBUser=zabbix

DBPassword=zBeG@Aa1

DBPort=3306

CacheSize=5000M

Timeout=30

ExternalScripts=/usr/lib/zabbix/externalscripts

FpingLocation=/usr/sbin/fping

SSHKeyLocation=/var/lib/zabbix/ssh_keys

User=zabbix

SSLCertLocation=/var/lib/zabbix/ssl/certs/

SSLKeyLocation=/var/lib/zabbix/ssl/keys/

SSLCALocation=/var/lib/zabbix/ssl/ssl_ca/

LoadModulePath=/var/lib/zabbix/modules/

StartPollers=200

三、zabbix-web浏览器浏览以及简单配置

3.1 在电脑浏览器输入http://ip/10000/zabbix,打开zabbix 首页,收入用户名Admin和密码zabbix,具体见下图

docker 搭建zabbix-server与zabbix-proxy_java

3.2 修改zabbix-web中文展示见下图

docker 搭建zabbix-server与zabbix-proxy_java_02

3.3 配置zabbix-proxy 接入zabbix-server,具体见下图。

docker 搭建zabbix-server与zabbix-proxy_docker_03

四、zabbix配置发送邮件

4.1 配置zabbix告警媒介

修改下图的脚本参数,见下图

docker 搭建zabbix-server与zabbix-proxy_java_04

4,2 配置zabbix 告警动作

4.2.1 配置zabbix告警操作

<主题> 框输入

故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生{TRIGGER.NAME}故障!

<消息>框输入

告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

docker 搭建zabbix-server与zabbix-proxy_mysql_05

4.2.2 配置zabbix动作恢复操作

<主题> 框输入

恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

<消息>框输入

告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

docker 搭建zabbix-server与zabbix-proxy_mysql_06

4.3 配置zabbix报警媒介

填写下面类型和收件人等等具体见下图

docker 搭建zabbix-server与zabbix-proxy_docker_07

4.4 书写zabbix发送邮件自定义报警脚本

cd /usr/lib/zabbix/alertscripts

touch sendEmail.sh

#!/bin/bash

FILE=/usr/lib/zabbix/alertscripts/history.txt

subjectFILE=/usr/lib/zabbix/alertscripts/subject.txt

toFILE=/usr/lib/zabbix/alertscripts/to.txt

FILE_bak=/usr/lib/zabbix/alertscripts/bak.txt

echo "$1" >>$toFILE

echo "$2" >$subjectFILE

echo "$3" >$FILE

cd /usr/lib/zabbix/alertscripts

python3 sendEmail.py

echo " " >to.txt

touch sendEmail.py

# -*- coding: utf-8 -*-

import smtplib

from  email.mime.text import MIMEText

from email.header import Header

def send_msg(result,to):

       msg_from="A1515802****@163.com"

       pwd="JOXJFLCNKPGNMR**"

       content="<h2>"+"zabbix告警情况:"+"<br />"+result[1]+"<br />"+result[2]+"<br />"+result[3]+"<br />"+result[4]+"<br />"+result[5]+"<br />"+result[6]+"<br />"+result[7]+"</h2>"  

       msg=MIMEText(content,"html","utf-8")

       with open('subject.txt','r') as f:

           subject=f.read()

           f.close()

       subject=Header(subject,"utf-8")

       msg["Subject"]=subject

       msg["From"]=msg_from

       msg["To"]=to                  

       msg["Accept-Language"]="zh-CN"          

       msg["Accept-Charset"]="ISO-8859-1,utf-8"

           

       try:                                            

                  ss=smtplib.SMTP_SSL("smtp.163.com",465)

                  ss.login(msg_from,pwd)                  

                  ss.sendmail(msg_from,to,msg.as_string())

                  ss.quit()                

                  print ('send suessfully')

                  return True              

       except smtplib.SMTPException as e:

                  print (e)    

                  return False

line_dict_uniq=dict()

with open('to.txt','r') as fd:

          for line in fd.readlines():

            to = line.split(' ')[0]

            if to  not in line_dict_uniq.values():

               line_dict_uniq[to] = line

               f=open('history.txt','r')

               result=f.readlines()

               print(result)

               print(to)

               send_msg(result,to)

            else:

               continue