添加邮件监控
主机环境:腾讯云
邮件服务:mailx
发送邮件服务器:126邮箱,465端口(25端口被封)
腾讯云默认限制云服务器的25端口,使用465端口
创建证书
echo -n | openssl s_client -connect smtp.126.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /usr/lib/zabbix/alertscripts/certs/ -i /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /usr/lib/zabbix/alertscripts/certs/ -i /usr/lib/zabbix/alertscripts/certs/126.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i ./126.crt
certutil -L -d /usr/lib/zabbix/alertscripts/certs
配置mailx
1.如果安装有sendmail或者postfix,需要关闭
systemctl stop sendmail
systemctl disable sendmail
systemctl stop postfix
systemctl disable postfix
2.安装mailx
yum –y install mailx
3.配置mail.rc
vim /etc/mail.rc
## mail configure
set [email protected]
set smtp=smtps://smtp.126.com:465 #smtp服务器
set [email protected] #邮箱
set smtp-auth-password=xxxxxx #授权密码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/usr/lib/zabbix/alertscripts/certs
测试mailx是否生效
echo "邮件正文" | mail -s "邮件主题" [email protected]
如果收到邮件,说明配置成功
4.mail脚本
cd /usr/lib/zabbix/alertscripts
[root@VM_0_3_centos alertscripts]# cat mail.sh
#!/bin/bash
#send mail
messages=`echo $3 | tr '\r\n' '\n'`
subject=`echo $2 | tr '\r\n' '\n'`
echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1
测试脚本是否生效
./mail.sh [email protected] "scrits" "test"
如果可以收到邮件,说明脚本配置正确
报错解决:
Error initializing NSS: Unknown error -8015.
. . . message not sent.
Error initializing NSS: Unknown error -8015.
. . . message not sent.
如果
echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1
测试脚本是否生效
./mail.sh [email protected] "scrits" "test"
两种方式都可以接收到邮件但是zabbix报警无法发送报警邮件,并且还报错Error initializing NSS: Unknown error -8015.
说明是证书权限问题
修改权限即可,注意telnet smpt.126.com 465 端口是通的,说明网络没有问题
zabbix web端配置
报警媒介配置
配置用户
配置动作
将主机的agent停掉,测试看能否收到邮件,有可能被发送到垃圾邮箱,需要设置一下。
.企业微信报警添加
配置企业微信报警
企业微信注册地址:企业微信注册
创建部门,添加运维人员
创建应用
记住这个AgentId和Secret,后面脚本会用到
我的企业-企业信息-查看企业ID,后面脚本会用到
查看部门ID
企业微信api调用:http://work.weixin.qq.com/api/devtools/devtool.php
zabbix脚本
[root@VM_0_3_centos ~]# cd /usr/lib/zabbix/alertscripts/
[root@VM_0_3_centos alertscripts]# cat wechat.sh
#!/bin/bash
#填写我们的应用CropID
CropID='******************'
#应用的Secret,下面的GURL和PURL 地址无需变动
Secret='*******************************'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
#Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $4}')
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1000002 #创建应用的ID
local UserID=$1 #接收消息用户,我们在部门里面添加的用户,如果有其他人,用逗号代替部门成员id,zabbix中定义的微信接收者
local PartyID=2 #接受消息的部门ID,定义了范围,组内成员都可接收到消息
local Msg=$(echo "$@" | cut -d" " -f3-)
printf '{\n'
printf '\t"touser": "'"$UserID"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'" $AppID "\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
[root@VM_0_3_centos alertscripts]# chown zabbix.zabbix wechat.sh
[root@VM_0_3_centos alertscripts]# chmod 744 wechat.sh
测试(第一参数changhuanyan是部门中的用户,第二个参数是subject,第三个参数标题)
[root@VM_0_3_centos alertscripts]# sh wechat.sh changhuanyan test test
{"errcode":0,"errmsg":"ok","invaliduser":""}
手机可以看到你发的消息就是测试成功了。
zabbix web界面设置
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
创建用户
配置动作
注:默认的步骤是1-1,也即是从1开始到1结束。一旦故障发生,就是执行sendEmail.sh脚本发生报警邮件给Admin用户 和zabbix administrator组。
假如故障持续了1个小时,它也只发送一次。如果改成1-0,0是表示不限制.无限发送
间隔就是默认持续时间60秒。那么一个小时,就会发送60封邮件。
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
{
告警主机:{HOST.NAME}
告警地址:{HOSTNAME1}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
---------------
---------------
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
{
告警主机:{HOST.NAME}
告警地址:{HOSTNAME1}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
}
----------------------
----------------------
服务器:{HOST.NAME}: 报警确认
{
确认人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:{ACK.MESSAGE}
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}
}
参考http://www.wqblogs.com/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2zabbix4-0%EF%BC%8C%E9%85%8D%E7%BD%AE%E5%BE%AE%E4%BF%A1%E6%8A%A5%E8%AD%A6/
问题:
使用了一段时间发现配置web报警时,因为监控项中有双引号以及空格,会被截断,发出的报警如下
监控项:
Response time for step "zabbix front" of scenario "zabbix frontend".
企业报警信息:
server发生: zabbix_frontend web down alert故障! {
告警主机:zabbix server
告警地址:118.25.101.253
监控项目:
所以更改脚本中的截取
15 local Msg=$(echo "$@" | cut -d" " -f3-$#)
27 /usr/bin/curl --data-ascii "$(body $1 $2 ${@:3})" $PURL
${@:3}代表将后面的数据都作为$3的数据,MSg截取也更改为截取$3以及后面的所有参数
在本地shell脚本中执行可以生效,但是发送报警信息还是被截取
所以果断更改shell脚本为python脚本,如下:
#!/usr/local/python3/bin/python3
# -*- coding:utf-8 -*-
import requests
import json
import sys
# 企业号及应用相关信息
corp_id = 'ww1921xxxx91df71'
corp_secret = 'iJJq9ykT4boDDqEOaxxxxxxxR4sjy9C7k'
agent_id = 1000002
# 存放access_token文件路径
file_path = '/tmp/access_token.log'
def get_access_token_from_file():
try:
f = open(file_path,'r+')
this_access_token = f.read()
print('get success %s' % this_access_token)
f.close()
return this_access_token
except Exception as e:
print(e)
# 获取token函数,文本里记录的token失效时调用
def get_access_token():
get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (corp_id, corp_secret)
print(get_token_url)
r = requests.get(get_token_url)
request_json = r.json()
this_access_token = request_json['access_token']
print(this_access_token)
r.close()
# 把获取到的access_token写入文本
try:
f = open(file_path,'w+')
f.write(this_access_token)
f.close()
except Exception as e:
print(e)
# 返回获取到的access_token值
return this_access_token
# snedMessage
# 死循环,直到消息成功发送
flag = True
while(flag):
# 从文本获取access_token
access_token = get_access_token_from_file()
try:
# to_user = '@all' ## 注意这样的话会发给所有人
to_user = sys.argv[1] ##这样zabbix中的参数才会有效
title = sys.argv[2]
message = sys.argv[3]
send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
print(send_message_url)
message_params = {
"touser":to_user,
"msgtype":"text",
"agentid":agent_id,
"text":{
"content" : title + '\n' + message
},
"safe": 0
}
r = requests.post(send_message_url, data=json.dumps(message_params))
print('post success %s ' % r.text)
# 判断是否发送成功,如不成功则跑出异常,让其执行异常处理里的函数
request_json = r.json()
errmsg = request_json['errmsg']
if errmsg != 'ok': raise
# 消息成功发送,停止死循环
flag = False
except Exception as e:
print(e)
access_token = get_access_token()
将此脚本放入到/usr/lib/zabbix/alertscripts中,并一定要注意wetchat.py和/tmp/access_token.log的权限属主为zabbix,否则无法发送报警。
[root@VM_0_3_centos alertscripts]# ll
total 16
-rwxr--r-- 1 zabbix zabbix 165 Apr 9 18:10 mail.sh
-rwxr--r-- 1 zabbix zabbix 2413 Apr 26 11:39 wechat.py
-rwxr--r-- 1 zabbix zabbix 1312 Apr 26 14:18 wechat.sh
-rwxr--r-- 1 zabbix zabbix 1331 Apr 24 22:19 wechat.sh.bak
[root@VM_0_3_centos alertscripts]# pwd
/usr/lib/zabbix/alertscripts
[root@VM_0_3_centos alertscripts]# ls -al /tmp/access_token.log
-rw-r--r-- 1 zabbix zabbix 214 Apr 26 12:17 /tmp/access_token.log
更改web中的脚本名称即可,
参考:
http://www.ttlsa.com/zabbix/use-wechat-send-zabbix-msg/
注意1:
运行一段时间上述python脚本,发现zabbix分组报警不生效,即使将用户停用了居然还可以发出报警,查看脚本发现
try:
to_user = '@all' ## 注意这样的话会发给所有人
title = sys.argv[2]
message = sys.argv[3]
send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
脚本中是发送给企业微信中所有人的,所以zabbix上的更改才会不生效,只需要将
to_user = '@all' ## 注意这样的话会发给所有人
更改为
to_user = sys.argv[1] ## zabbix传递过来的参数
特此记录
注意2:
如果发现wechat.py脚本无法发出报警,在网络没有问题的情况下请注意权限,手动执行./usr/lib/zabbix/alertscripts/wechat.py changhuanyan test test 可以正常发送,但是zabbix端无法发送时,要注意脚本中/tmp/access_token.log的权限!!!
[root@VM_20_3_centos alertscripts]# ls -al /tmp/access_token.log
-rw-r--r-- 1 zabbix zabbix 214 Aug 26 19:13 /tmp/access_token.log