钉钉群创建钉钉机器人
通过curl命令发送消息给机器人
#实例
curl '机器人URL' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text", "text": {"content": "告警通知 钉钉机器人测试"}}'
#实际使用
curl 'https://oapi.dingtalk.com/robot/send?access_token=ac660ea5e5c195dcc6dd8b54ba0f8239d031b541702997b22bac93c7d77bd6d1' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text", "text": {"content": "告警通知 钉钉机器人测试"}}'
通过python
脚本发送消息给机器人
dingding.py
脚本内容
#!/usr/bin/python3
#-*- coding: utf-8 -*-
import requests,json,sys,os,datetime
#设置机器人URL(webhook的值)
webhook="机器人URL"
#发给钉钉群中哪个用户
user=sys.argv[1]
#发送的报警内容
text=sys.argv[3]
data={
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
#钉钉API固定数据格式
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
#将发送的告警信息写入本地日志
if os.path.exists("/usr/lib/zabbix/alertscripts/dingding.log"):
f=open("/usr/lib/zabbix/alertscripts/dingding.log","a+")
else:
f=open("/usr/lib/zabbix/alertscripts/dingding.log","w+")
f.write("\n"+"--"*30)
#判断条件
if x.json()["errcode"] == 0:
f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"发送成功"+"\n"+str(text))
f.close()
else:
f.write("\n"+str(datetime.datetime.now()) + " " + str(user) + " " + "发送失败" + "\n" + str(text))
f.close()
dingding.py
测试
./dingding.py dingding test "告警通知 钉钉机器人测试"
dingding #群组里接收消息的任意一人的钉钉号
test #这里因脚本中没有设置接收参数(所以无实际意义仅仅起到变量占位的作用)
"告警通知 钉钉机器人测试" #这段文字中为告警消息中显示的信息(必须包含刚才机器人安全设置中的关键词否则将不会收到消息)
Zabbix容器配置钉钉机器人
将容器脚本路径映射到宿主机
#查看zabbix-server容器脚本存放路径
docker exec zabbix-server cat /etc/zabbix/zabbix_server.conf | grep ^AlertScriptsPath=
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#将脚本存放路径映射到宿主机
vim docker-compose.yaml
version: '3.5'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:centos-6.0-latest
container_name: zabbix-server
restart: always
ports:
- "10051:10051"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:rw #映射脚本目录(权限设置未读写)
- ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro
- ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
- ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
- ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
- ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
- ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro
- snmptraps:/var/lib/zabbix/snmptraps:rw
#关闭Zabbix容器
docker-compose --profile=all down
#运行Zabbix容器
docker-compose --profile=all up -d
容器内安装
python3
#方法一使用root用户连接容器
docker exec -it -u root zabbix-server bash
yum install python3
python3 -V
#方法二直接通过docker exec命令给容器安装软件
docker exec -u root zabbix-server yum -y install python3
docker exec zabbix-server python3 -V
准备钉钉机器人
python
脚本
vim ./zbx_env/usr/lib/zabbix/alertscripts/dingding.py
#!/usr/bin/python3
#-*- coding: utf-8 -*-
import requests,json,sys,os,datetime
webhook="https://oapi.dingtalk.com/robot/send?access_token=ac660ea5e5c195dcc6dd8b54ba0f8239d031b541702997b22bac93c7d77bd6d1"
user=sys.argv[1]
text=sys.argv[3]
data={
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
if os.path.exists("/usr/lib/zabbix/alertscripts/dingding.log"):
f=open("/usr/lib/zabbix/alertscripts/dingding.log","a+")
else:
f=open("/usr/lib/zabbix/alertscripts/dingding.log","w+")
f.write("\n"+"--"*30)
if x.json()["errcode"] == 0:
f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"发送成功"+"\n"+str(text))
f.close()
else:
f.write("\n"+str(datetime.datetime.now()) + " " + str(user) + " " + "发送失败" + "\n" + str(text))
f.close()
赋予钉钉机器人
python
脚本权限并测试
#赋予权限
chmod 777 -R ./zbx_env/usr/lib/zabbix/alertscripts
#测试脚本
docker exec zabbix-server /usr/lib/zabbix/alertscripts/dingding.py dingding test "告警通知 钉钉机器人测试"
#查看日志
docker exec zabbix-server cat /usr/lib/zabbix/alertscripts/dingding.log
Zabbix添加报警媒介
#脚本参数
{ALERT.SENDTO} #对应脚本中的user=sys.argv[1](发给钉钉群中哪个用户)
{ALERT.SUBJECT} #发送的信息的标题(在报表的动作日志中可以看到)
{ALERT.MESSAGE} #对应脚本中的text=sys.argv[3](发送的报警内容)
Zabbix容器配置邮箱
Zabbix添加报警媒介
Agent2监控MySQL
服务
创建
MySQL
用户进行监控
#password由您自行决定
mysql> CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
mysql> GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'zbx_monitor'@'%';
修改
MySQL by Zabbix agent 2
监控模板
添加
MySQL
监控主机
创建告警动作
配置告警操作
#钉钉机器人和邮箱的告警操作消息内容通用
#主题
故障名称:{EVENT.NAME}
#消息内容
【----告警通知----】
告警主机:{HOSTNAME1}
主机IP:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
配置用户告警媒介
被监控主机关闭
MySQL
服务测试报警