首页 生活随笔

由于家里的电子设备比较多,对设备统一管理和状态监测是一个需要认真对待的问题,之前找了很多方案但是始终不满意,最后选择搭建了一个企业级分布式监控系统Zabbix,用python推送监控信息到企业微信,像下图这样,可以及时知道哪台主机有问题
QQ截图20210901202538.jpg
同时也能从专业角度对家里内网的每个主机资产和web资产性能进行监测,输出周期报表和数据图
QQ截图20210901203118.jpg
简单说下操作步骤:
Zabbix搭建一般分为4个部分:1.后端服务器;2.前端服务器;3.数据库服务器;4.客户端Agent。
因为服务器“性能有限”,所以我们就用Docker来进行部署好了。另外就家里用,也不用部署agent啥的
162d5912-1e06-460b-a938-870ac16b5070.jpg
第一步,安装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创建一个网络,模式选桥接,剩下参数随便写
QQ截图20210901203728.jpg
然后我们找个地方大的地方放数据库,就放在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就可以登录了
QQ截图20210901204931.jpg
然后到设置里把界面调成中文的
QQ截图20210901205134.jpg
然后修改下用户名和密码,不要用默认的密码,也不要用默认的用户名
QQ截图20210901205216.jpg
界面那个字体有时候对中文支持不太好,需要在后台替换一下,在宿主机上敲下面这个命令可以直接找到服务器的字体文件夹映射

find / -name DejaVuSans.ttf

找到这个文件夹,把windows系统里面的楷体simkai.ttf替换进去,这个文件直接随便找个电脑用everything一搜就有了
QQ截图20210901205446.jpg
用同样的方法找到defines.inc.php,把前端默认字体文件改成simkai
QQ截图20210901205752.jpg
这就部署好了。

我们添加一个站点的监测,配置-主机-创建主机-web监测-创建web场景
QQ截图20210901210034.jpg
步骤-添加
QQ截图20210901210042.jpg
名称-url-添加
QQ截图20210901210136.jpg
然后配置个触发器,配置-主机-触发器-创建触发器
QQ截图20210901210258.jpg
添加一个表达式,比如说我们要在站点访问超过2秒时告警,添加-Response time
QQ截图20210901210420.jpg
结果写2s
QQ截图20210901210507.jpg
触发器创建完成后,我们加个Action,也就是触发告警后要做什么,就是邮件和微信通知了
加Action之前,先添加下企业微信和邮箱的登录方式,管理-报警媒介类型
先配置告警邮箱,具体怎么搭建企业邮箱申请域名备案解析MX,比较简单百度都有,此处略
QQ截图20210901210728.jpg
然后配置企业微信通知,首先企业微信找个群右键添加机器人,复制webhook地址
QQ截图20210901211019.jpg
在宿主机用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,报警媒介类型-创建媒体类型-企业微信告警,填写脚本名称
QQ截图20210901211210.jpg
然后添加Action,配置-动作-创建动作,把刚才触发器选上
QQ截图20210901211358.jpg
然后翻到页签2操作,配置操作细节,告警时候发送给谁,怎么发,消息格式是啥,都要填好
QQ截图20210901211426.jpg
我简单写了个告警邮件模板供参考

告警邮件主题:【栗子云】栗子网盘访问异常!
消息:告警主机:{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

然后再测试就可以正常收到告警了。

QQ截图20210901212716.jpg
发现告警时间好像不大对,还需要重新登录前后端的后台,调下时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

这样,zabbix就基本部署完成了,里面还有好多好玩的功能可以折腾的,比如可以在家里停电时候给你发短信提醒你交话费啥的,或者有人在非工作时间动了你公司的电脑,立刻微信通知你啥的,用这个程序都可以简单地实现。
周末再继续鼓捣。有问题随时留言。




文章评论