Docker下搭建企业级分布式监控系统Zabbix,并实现企业微信推送
由于家里的电子设备比较多,对设备统一管理和状态监测是一个需要认真对待的问题,之前找了很多方案但是始终不满意,最后选择搭建了一个企业级分布式监控系统Zabbix,用python推送监控信息到企业微信,像下图这样,可以及时知道哪台主机有问题
同时也能从专业角度对家里内网的每个主机资产和web资产性能进行监测,输出周期报表和数据图
简单说下操作步骤:
Zabbix搭建一般分为4个部分:1.后端服务器;2.前端服务器;3.数据库服务器;4.客户端Agent。
因为服务器“性能有限”,所以我们就用Docker来进行部署好了。另外就家里用,也不用部署agent啥的
第一步,安装Docker……这部分就略了
第二步,为Docker配置一个Bridge网络,这里我对Docker命令不熟悉,所以直接装了个Portainer,用图形界面管理Docker
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker:/data --name webui portainer/portainer
创建好了portainer后,登录跳到Networks > Add network创建一个网络,模式选桥接,剩下参数随便写
然后我们找个地方大的地方放数据库,就放在home目录下好了
创建个数据库,扔到刚才创建的docker网络里,自定义一个IP,注意格式要定义成utf8
docker run --name mysql --network zabbix --ip 172.20.0.124 -e MYSQL_ROOT_PASSWORD=你的数据库root密码 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -d mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_bin
然后docker exec命令进到数据库,新建一个用户带一个库,用于给zabbix用
mysql -u root -p
create database zabbix;
CREATE USER zabbixuser IDENTIFIED BY '数据库用户密码';
grant all on zabbix.* to 'zabbixuser'@'%';
ALTER USER zabbixuser IDENTIFIED WITH mysql_native_password BY '数据库用户密码';
FLUSH PRIVILEGES;
退了数据库,我们开始部署zabbix后端,一行命令就搞定
注意要自定义一个IP,映射10051端口,用link参数把这个容器和数据库容器连起来,然后在命令后面填好数据库地址、用户名、密码。
docker run --name zabbix-server --network zabbix --ip 172.20.0.122 -p 10051:10051 --link mysql:mysql -e DB_SERVER_HOST="mysql" -e MYSQL_USER="zabbixuser" -e MYSQL_PASSWORD="数据库密码" -d zabbix/zabbix-server-mysql
后端部署好了之后我们部署前端,注意不要忘了自定义IP,映射8080端口,link参数连接数据库和后端,serverhost直接填刚才后端的docker名字就可以了
docker run --name zabbix-web --network zabbix --ip 172.20.0.123 -p 18080:8080 --link mysql:mysql --link zabbix-server:zabbix-server -e DB_SERVER_HOST="mysql" -e MYSQL_USER="zabbixuser" -e MYSQL_PASSWORD="数据库密码" -e ZBX_SERVER_HOST="zabbix-server" -e PHP_TZ="Asia/Shanghai" -d zabbix/zabbix-web-nginx-mysql
然后别忘了把这四个Restart policies都改成Always或者Unless Stoped,不然重启服务器之后容器自己起不来
然后输入zabbix-web的8080端口映射出来的地址,默认用户名admin密码zabbix就可以登录了
然后到设置里把界面调成中文的
然后修改下用户名和密码,不要用默认的密码,也不要用默认的用户名
界面那个字体有时候对中文支持不太好,需要在后台替换一下,在宿主机上敲下面这个命令可以直接找到服务器的字体文件夹映射
find / -name DejaVuSans.ttf
找到这个文件夹,把windows系统里面的楷体simkai.ttf替换进去,这个文件直接随便找个电脑用everything一搜就有了
用同样的方法找到defines.inc.php,把前端默认字体文件改成simkai
这就部署好了。
我们添加一个站点的监测,配置-主机-创建主机-web监测-创建web场景
步骤-添加
名称-url-添加
然后配置个触发器,配置-主机-触发器-创建触发器
添加一个表达式,比如说我们要在站点访问超过2秒时告警,添加-Response time
结果写2s
触发器创建完成后,我们加个Action,也就是触发告警后要做什么,就是邮件和微信通知了
加Action之前,先添加下企业微信和邮箱的登录方式,管理-报警媒介类型
先配置告警邮箱,具体怎么搭建企业邮箱申请域名备案解析MX,比较简单百度都有,此处略
然后配置企业微信通知,首先企业微信找个群右键添加机器人,复制webhook地址
在宿主机用find命令找到alertscripts文件夹,放个脚本,脚本内容修改为你自己的
find / -name alertscripts
脚本内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "这里改成你创建的机器人的Webhook"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text,
"mentioned_mobile_list":["这里写你企微手机号,机器人发告警时会艾特你"]
},
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
然后回到zabbix,报警媒介类型-创建媒体类型-企业微信告警,填写脚本名称
然后添加Action,配置-动作-创建动作,把刚才触发器选上
然后翻到页签2操作,配置操作细节,告警时候发送给谁,怎么发,消息格式是啥,都要填好
我简单写了个告警邮件模板供参考
告警邮件主题:【栗子云】栗子网盘访问异常!
消息:告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警信息: {TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
告警恢复邮件主题:【栗子云】栗子网盘恢复访问
消息:告警信息: {TRIGGER.NAME}
当前状态:{TRIGGER.STATUS},感觉好像已经恢复了
恢复时间:{EVENT.DATE} {EVENT.TIME}
配置好了Action之后,理论上就等着告警就行了,但是有个问题
docker版的前后端,是alpine linux,不带python,刚才传的python脚本运行会报错
所以我们需要docker exec到docker里面,手动安装python环境
然后这个docker默认的/bin/bash还不是root的,需要从宿主机提下权限,23f是docker编号,用docker ps命令可以查看
docker exec -it -u root 23f sh
更新下软件源
apk update
安装python3,pip3,request,运行脚本报错,于是这里改为安装python2和对应pip
apk add python2
安装pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
安装requests模块
pip install requests
然后再回到zabbix测试脚本,发现报了个错/usr/bin/python^M: 解释器错误
^M很好判断,就是刚才直接把windows下写的文档复制到linux了,zabbix后端在执行时会用./命令执行,而不是python命令执行,./命令会概率出现兼容性问题,一行命令修改下异常隐藏字符,解决
sed -i 's/^M//g' wechat.py
然后再测试就可以正常收到告警了。
发现告警时间好像不大对,还需要重新登录前后端的后台,调下时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这样,zabbix就基本部署完成了,里面还有好多好玩的功能可以折腾的,比如可以在家里停电时候给你发短信提醒你交话费啥的,或者有人在非工作时间动了你公司的电脑,立刻微信通知你啥的,用这个程序都可以简单地实现。
周末再继续鼓捣。有问题随时留言。