一、环境配置
1、配置zabbix服务端
2、配置监控主机&监控项&监控模板
zabbix配置安装_this page is used to test the proper operation of _疯飙的蜗牛的博客-CSDN博客
二、触发器
触发器的本质就是一个条件判断,对于不同的监控数据来说,我们要设置不同的触发器。如一个监控项不关联触发器,将不会提示错误,也不会触发告警动作。
触发器(trigger):
触发器实际是一个条件判断表达式,如判断硬盘使用率超过80%
当触发条件发生后,会触发事件,用于某个动作
动作 (action):
触发器的条件被触发时候的具体操作
可以是发送邮件、执行远程命令。可以单独设置,也可以相互配合。
1、创建触发器
2、触发器表达式
表达式格式:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
{主机名:监控key.函数(参数)}<表达式>常数
这个表达式在zabbix中是不需要手动编写的,可以在zabbix配置页面选择
3、表达式函数
- 大多数函数使用秒作为参数,使用#代表不同含义
- avg,count,last,min and max 函数支持额外的第二个参数time_shift(时间偏移量)这个参数允许从过去一段时间内引用数据
三、配置报警媒介
发送通知有多种方式:邮件、短信、钉钉、微信、企微、飞书等。
发送通知就是发送消息,消息的载体我们称为媒介,所以要执行发送通知动作,需要先创建一个报警媒介(当现有媒介不能满足需求的时候)。
1、媒介之邮件
2、媒介之钉钉告警&微信等
钉钉&微信&飞书等都是通过 类型为脚本 的方式设置媒介类型
脚本参数参考如下:
{ALERT.SENDTO} 消息的接收者
{ALERT.SUBJECT} 消息主题
{ALERT.MESSAGE} 告警信息
四、告警信息模板
信息模板,根据不同的消息类型信息模板的内容也有不同。
1、配置模板
2、内容参数说明
故障信息参数:
#####默认标题
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
#####消息内容
告警主机: {HOSTNAME1}
主机IP: {HOST.IP}
告警时间: {EVENT.DATE} {EVENT.TIME}
告警等级: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
监控取值: {ITEM.LASTVALUE}
告警项目: {TRIGGER.KEY1}
问题详情: {ITEM.NAME}:{ITEM.VALUE}
当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID: {EVENT.ID}
故障恢复信息参数:
#####默认标题
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME} 已恢复 !
#####消息内容
告警主机: {HOSTNAME1}
主机IP: {HOST.IP}
恢复时间: {EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间: {EVENT.AGE}
告警等级: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
监控取值: {ITEM.LASTVALUE}
告警项目: {TRIGGER.KEY1}
问题详情: {ITEM.NAME}:{ITEM.VALUE}
当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID: {EVENT.ID}
五、配置用户群组及用户
用户与报警媒介相关联,只有用户对服务器群组有读取权限才能发送告警通知。
通过用户群组配置相关服务器群组读、写权限,用户继承群组权限。
1、用户群组
2、用户
六、配置动作
1、动作
2、动作步骤配置说明
默认的步骤是1-3,也即是从1开始到3结束。一旦故障发生,就执行脚本,发送给群组成员的用户。即使是故障持续1小时,也只发送3此告警,时间间隔为0秒
如果改成1-0 , 0表示无限制, 无限制发送告警
间隔时间是默认持续时间60秒,也就是1分钟1次,如持续1小时发送60次告警。
如设置成3-5,也就是持续3次也就是默认3*60=180秒后才发送告警给用户。
七、脚本
1、钉钉脚本
#!/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= 这里填写钉钉机器人地址" #填入刚刚复制的webhook
api_url = sys.argv[1]
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
"15901402212" #填入号码会@相应号码的人
],
"isAtAll": True # True会@所有人
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[2]
msg(text)
2、企微脚本
[root@zabbix-server alertscripts]# cat EN-WeChat.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 = sys.argv[1]
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[2]
msg(text)
3、微信脚本
注:需要建立相关redis服务、微信告警服务等,直接使用脚本是不成功的。
[root@zabbix-server alertscripts]# cat weixin.sh
#!/bin/bash
cd /etc/zabbix/alertscripts/
to=$1
str=$2
body=$3
host=`echo $str |awk -F [:] '{print $2}'`
key=`cat /proc/sys/kernel/random/uuid`
echo $0 >> /etc/zabbix/alertscripts/1.log
echo $to >> /etc/zabbix/alertscripts/1.log
echo $str >> /etc/zabbix/alertscripts/1.log
echo $body >> /etc/zabbix/alertscripts/1.log
echo $host >> /etc/zabbix/alertscripts/1.log
echo $key >> /etc/zabbix/alertscripts/1.log
#/bin/sh /etc/zabbix/alertscripts/send-alarm.sh 2 "告警主机:$host\n告警主题: $str\n告警内容:$body" 'zabbix' $1 "$key" 0 "$str"
./send-alarm.sh 2 "告警主机:$host\n告警主题: $str\n告警内容:$body" 'yunwei-zabbix' $1 "$key" 0 "zabbix-test9" "告警内容:test-11199"
[root@zabbix-server alertscripts]# cat send-alarm.sh
#!/bin/sh
redisclient="/usr/bin/redis-cli"
#redisclient="/data/server/redis/bin/redis-cli"
#redisclient="/usr/bin/redis-cli"
redis_slave_server=""
redis_slave_port=""
redis_master_server=""
redis_master_port=""
function UpdateRedisSlaveAddr(){
local s_addr=$1
local s_port=$2
for ser in "${sentinel_addr[@]}"
do
local info=`${redisclient} -h $s_addr -p $s_port SENTINEL slaves mymaster`
redis_slave_server=`echo $info | awk -F" " '{print $4}'`
redis_slave_port=`echo $info | awk -F" " '{print $6}'`
if [ -n "$redis_slave_server" ]
then
break
fi
done
}
function UpdateRedisMasterAddr(){
local s_addr=$1
local s_port=$2
for ser in "${sentinel_addr[@]}"
do
local info=`${redisclient} -h $s_addr -p $s_port SENTINEL get-master-addr-by-name mymaster`
redis_master_server=`echo $info | awk -F" " '{print $1}'`
redis_master_port=`echo $info | awk -F" " '{print $2}'`
if [ -n "$redis_master_server" ]
then
break
fi
done
}
#{"notifyType":3,"level":1,"host":"10.0.333333333","subType":"cost","detail":"告警时间:2018-06-07 17:45:918\n广告主:测试更新流\n计划:测试审核Bann555554er\n订单:test\n告警内容:目标值已达到10.0%(7990)目标值已达到10.0%(7990)","department":1,"title":"order 190999 cost 告警","key":"20180621113123","status":0}
if [ $# != 8 ]
then
echo "Parameter Erorr!"
echo "eg: $0 NOTIFYTYPE LEVEN SUBTYPE DEPARTMENT KEY STATE TITLE DETAIL"
exit
fi
date=`date`
notify_type=$1
level=1
sub_type=$3
depart=$4
key=$5
state=$6
title=$7
detail=$2
host=`hostname`
echo $detail >> /data/z.log;
echo $detail > /etc/zabbix/alertscripts/detail.log
sed -i 's/\r//g' /etc/zabbix/alertscripts/detail.log
detail_file=/etc/zabbix/alertscripts/detail.log
# keyword4=`ec | awk -F '告警内容:' '{print $2}' | awk -F '\\\r\\\n' '{print $1}' | awk -F ': ' '{print $2}'`
keyword4="`cat $detail_file | awk -F '告警内容:' '{print $1}' |awk -F ':' '{print $3}'`"
keyword3="`cat $detail_file | awk -F '告警时间:' '{print $2}' | awk -F '告警' '{print $1}'`"
keyword1="`cat $detail_file | awk -F '告警等级:' '{print $2}' | awk '{print $1}'`"
keyword5="`cat $detail_file | awk -F '告警信息:' '{print $2}' | awk -F '告警' '{print $1}'`"
keyword2="`cat $detail_file | awk -F '当前状态:' '{print $2}' | awk '{print $1}' | awk -F ':' '{print $1}'`"
#detail_info="\"keyword1\":\"${keyword1}\",\"keyword2\":\"${keyword2}\",\"keyword3\":\"${keyword3}\",\"keyword4\":\"${keyword4}\",\"keyword5\":\"${keyword5}\""
detail_info="\"detailLevel\":\"${keyword1}\",\"detailType\":\"${keyword2}\",\"detailTime\":\"${keyword3}\",\"detailPostion\":\"${keyword4}\",\"detailBusiness\":\"${keyword5}\""
#detail="\"\""
####info####
#故障等级:{{keyword1.DATA}}
#故障类型:{{keyword2.DATA}}
#故障时间:{{keyword3.DATA}}
#故障定位:{{keyword4.DATA}}
#所属业务:{{keyword5.DATA}}
############
#info="{\"notifyType\":$notify_type,\"level\":$level,\"host\":\"$host\",\"subType\":\"$sub_type\",\"detail\":\"$detail\",\"department\":$depart,\"title\":\"$title\",\"key\":\"$key\",\"status\":$state}"
info="{\"notifyType\":$notify_type,\"level\":$level,\"host\":\"$host\",\"subType\":\"$sub_type\",$detail_info,\"department\":$depart,\"title\":\"$title\",\"key\":\"$key\",\"status\":$state}"
#info="{\"notifyType\":$notify_type,\"level\":$level,\"host\":\"$host\",\"subType\":\"$sub_type\",\"detail\":$detail,$detail_info,\"department\":$depart,\"title\":\"$title\",\"key\":\"$key\",\"status\":$state}"
echo $info >> /data/z.log
sentinel_addr=(192.168.1.165 192.168.1.166 192.168.1.146)
UpdateRedisMasterAddr $sentinel_addr 26502
echo "Get Master: $redis_master_server $redis_master_port"
key="alarm:list"
echo "lpush $key $info"
result=`${redisclient} -h $redis_master_server -p $redis_master_port lpush $key "$info"`
echo $result >> /data/z.log