前言

近期在琢磨Zabbix邮箱报警的功能,但是网上的教程通常是4.0或5.0版本Zabbix,并使用Python2.7环境,运行在新版本Zabbix6.0上有颇多问题,为此我基于原先教程修改基于Zabbix6.0并使用Python3+的解决方案。期间遇到不少坑,特此分享。

Zabbix自带报警

Zabbix是自带的邮箱的报警功能有限,比如不能实现诸如邮件插入图片的功能,而可以使用执行脚本功能则可以调用本地程序,调用Python脚本从而实现许多如发送企业微信、钉钉使用的功能。

前端设置

报警媒介

在zabbix中保存脚本文件的目录为/usr/lib/zabbix/alertscripts/,目前4.0\5.0\6.0都通用,将shell脚本文件保存于此可以直接在报警媒介类型调用。

参数需要传递给脚本,对于着Shell脚本中的$1$2$3

{ALERT.SENDTO} //发件人(对应着用户\报警媒介中配置的发件人)
{ALERT.SUBJECT} //主题(对应着主题模版)
{ALERT.MESSAGE} //消息内容(对应着消息模版)

发件人

主题\消息内容

报警媒介消息模版

在消息模版中,添加问题发生

// 问题发生
// 主题
发生故障:服务器:{HOSTNAME}->{TRIGGER.NAME}警告!
// 消息
监控ID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}

添加问题恢复

//问题恢复
// 主题
问题恢复:服务器:{HOST.NAME}->{TRIGGER.NAME}已恢复!
// 消息
监控ID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}

设置用户报警媒介

在管理\用户<用户名>\报警媒介

如果有多个收件人,用,分割,我在python中做了定义

设置动作

要想要脚本触发问题后执行还需要设置

脚本实现

涉及到两个脚本

Shell脚本/usr/lib/zabbix/alertscripts/sedmail.zabbix.sh

主要是用于实现连接Python脚本,测试、删除图片

创建/usr/lib/zabbix/alertscripts/graph

Python脚本

主要是实现Zabbix中图片的下载、邮件发送

Shell脚本

新版本的Zabbix6.0貌似不支持直接执行Python脚本,为此我使用一个shell脚本作为中转,且可实现简单的测试、删除图片文件。

/usr/lib/zabbix/alertscripts/sedmail.zabbix.sh

#!/bin/bash
cd `dirname $0`
echo "{ALERT.SENDTO} = $1" > debug.txt
echo "{ALERT.SUBJECT} = $2" >> debug.txt
echo "{ALERT.MESSAGE} = $3" >> debug.txt
python3 sedmail.zabbix.py "$1" "$2" "$3" >> debug.txt
echo "shell success" >> debug.txt
find graph -type f -name "*.png" | xargs rm

Python脚本

主要是实现Zabbix中图片的下载、邮件发送,本Python脚本使用Python3环境,如果你需

脚本过程

  1. 解析传递过来的主题{ALERT.SENDTO}主题{ALERT.SUBJECT}消息{ALERT.MESSAGE}消息中的监控ID:后的数字,即itemid,此项极为重要
itemid=re.search(r'监控ID:(\d+)',sys.argv[3]).group(1)
# 如果你改了消息模版记得修改一下search匹配规则
  1. 登录Zabbix:使用Post登录http://zabbix:8080/index.php
 "name":user, # 用户
"password":password, # 密码
"autologin":"1", # 30天内自动登录
"enter":"登录", # 请注意这个对应你语言,如果是英文为login on,可以抓包看看

  1. 故障的统计图下载,对应着先前的itemid参数,可以使用get请求http://zabbix:8080/chart.php后带的参数
 "from" :"now-30m",
"to" : "now",
"itemids[0]" : itemid,# 请注意,Zabbix6.0中是itemid[0],在更老的4.0\5.0使用的itemid
"width" : "300",
#对应的url,以itemid[0]=79672为例
http://zabbix:8080/chart.php?from=now-30m&to=now&itemids%5B0%5D=79672&width=300

注意需要在登录的前提下,并且login的headers消息头一致,不然对提示错误

文件会保存在graph_path='/usr/lib/zabbix/alertscripts/graph'如果没有此文件夹需要创建

完整脚本

/usr/lib/zabbix/alertscripts/sedmail.zabbix.py

#!/usr/bin/python3
#coding=utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib,sys,os,time,re,requests,logging
from smtplib import SMTP user='Admin' #定义zabbix用户名
password='password' #定义zabbix用户密码
graph_path='/usr/lib/zabbix/alertscripts/graph' #定义图片存储路径
graph_url='http://127.0.0.1:8080/chart.php' #定义图表的url
loginurl="http://127.0.0.1:8080/index.php" #定义登录的url
host='127.0.0.1'
to_email=sys.argv[1].split(',') #传入的第一个参数为收件人邮箱
subject=sys.argv[2] #传入的第二个参数为邮件主题
subject=subject.encode('utf-8').decode('utf-8')
smtp_host = 'smtp.xxx.net' #定义smtp主机地址
from_email = 'alittlemc@xxx.com' #定义发件人地址
mail_pass = 'xxx' #发件人邮箱校验码\密码 def get_itemid():
#获取报警的itemid
itemid=re.search(r'监控ID:(\d+)',sys.argv[3]).group(1)
return itemid def get_graph(itemid):
#获取报警的图表并保存
session=requests.Session() #创建一个session会话
try:
loginheaders={
"Host":host,
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
}
#定义请求消息头 payload = {
"name":user,
"password":password,
"autologin":"1",
"enter":"登录",
}
#定义传入的data
login=session.post(url=loginurl,headers=loginheaders,data=payload)
# print(login.text)
#进行登录
graph_params={
"from" :"now-30m",
"to" : "now",
"itemids[0]" : itemid,
"width" : "300",
}
# print(itemid)
# http://zabbix:8080/chart.php?from=now-1m&to=now&itemids%5B0%5D=79672 #定义获取图片的参数
graph_req=session.get(url=graph_url,params=graph_params,headers=loginheaders)
#发送get请求获取图片数据
time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
graph_name='baojing_'+time_tag+'.png'
#用报警时间来作为图片名进行保存
graph_name = os.path.join(graph_path, graph_name)
#使用绝对路径保存图片
with open(graph_name,'wb') as f:
f.write(graph_req.content)
#将获取到的图片数据写入到文件中去
return graph_name except Exception as e:
# print(e)
return False
def text_to_html(text):
#将邮件内容text字段转换成HTML格式
d=text.splitlines()
#将邮件内容以每行作为一个列表元素存储在列表中
html_text=''
for i in d:
i='' + i + '<br>'
html_text+=i + '\n'
#为列表的每个元素后加上html的换行标签
return html_text def send_mail(graph_name):
#将html和图片封装成邮件进行发送
msg = MIMEMultipart('related') #创建内嵌资源的实例 with open(graph_name,'rb') as f:
#读取图片文件
graph=MIMEImage(f.read()) #读取图片赋值一个图片对象
graph.add_header('Content-ID','imgid1') #为图片对象添加标题字段和值
text=text_to_html(sys.argv[3])
html="""
<html>
<body>
%s <br><img src="cid:imgid1">
</body>
</html>
""" % text
html=MIMEText(html,'html','utf-8') #创建HTML格式的邮件体
msg.attach(html) #使用attach方法将HTML添加到msg实例中
msg.attach(graph) #使用attach方法将图片添加到msg实例中
msg['Subject'] = subject
msg['From'] = from_email
try:
server=SMTP(smtp_host,"587") #创建一个smtp对象
server.starttls() #启用安全传输模式
server.login(from_email,mail_pass) #邮箱账号登录
for x in to_email:
server.sendmail(from_email,x,msg.as_string()) #发送邮件
server.quit() #断开smtp连接
except smtplib.SMTPException as a:
print(a) def run():
itemid=get_itemid()
graph_name=get_graph(itemid)
send_mail(graph_name) if __name__ =='__main__':
run()
print('success',sys.argv[1],sys.argv[2],sys.argv[3])

测试

可以直接使用报警媒介的测试功能,对应的传输主题{ALERT.SENDTO}主题{ALERT.SUBJECT}消息{ALERT.MESSAGE}消息

(保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警的更多相关文章

  1. cocos2d-x 3.0 利用python脚本在文件夹Classes内创建class

    因为VS2012创建默认文件是在proj.win32下,新建类不在VS的classes于是编译时找不到类.直接写个脚本帮助新建类(cpp和h文件),还能够在里面加上一些预先写好的代码. 批处理文件Cr ...

  2. 阿里云收集服务器性能指标的python脚本

    #!/usr/bin/python ######################################### # Function: sample linux performance ind ...

  3. 远程登录服务器执行cmd的Python脚本

    import paramiko,os,sys ip = raw_input("input ip address :>>>") password = raw_inp ...

  4. 使用C#调用Python脚本,带参数列表 z

    static void Main(string[] args) { string[] strArr;//参数列表 string sArguments = @"Pythons.py" ...

  5. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  6. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境

    在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTING ...

  7. [奶奶看了都会]ChatGPT保姆级注册教程

    大家好,我是小卷 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜.这个聊天机器人最大的特点是模仿人类说话风格同时回答大量问题. 有人说ChatGPT是真正的人工 ...

  8. 【Python】使用Python处理RAW格式图片,并根据实际情况完成分组打包发送

    背景 出游之后,朋友交换的照片格式大多是RAW格式,一些人想要JPG格式,但是百度云盘非会员的下载速度惨不忍睹,所以我想着通过微信群直接传(这个在事后也被证实不能完全解决问题,微信限制了每天传递文件的 ...

  9. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  10. 用 Python 脚本实现对 Linux 服务器的监控

    目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (172)-- 算法导论13.3 1题

    一.用go语言,在 RB-INSERT 的第 16 行,将新插人的结点 z 着为红色.注意到,如果将 z 着为黑色,则红黑树的性质4就不会被破坏.那么为什么不选择将 z 着为黑色呢? 文心一言: 在红 ...

  2. Java通过SSH连接路由器,输入命令并读取响应

    最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应. 1.添加mwiede/jsch依赖 如果使用Maven,可以在pom.xml文件中添加以下依赖: < ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题

    一.在高度为h的堆中,元素个数最多和最少分别是多少? 文心一言: 在高度为 h 的二叉搜索树(BST)中,元素个数最多和最少的情况分别如下: 1.最多情况:当每个节点都包含两个子节点时,BST 中的元 ...

  4. GetView介绍 以及 GetxController生命周期

    etView 只是对已注册的 Controller 有一个名为 controller 的getter的 const Stateless 的 Widget,如果我们只有单个控制器作为依赖项,那我们就可以 ...

  5. curl使用小记(二)——远程下载一张图片

    目录 1. 概述 2. 实例 3. 参考 1. 概述 在之前的文章<curl使用小记(一)>中论述了命令行工具curl的基本使用.除此之外,curl还提供了能够直接供程序调用的模块库接口l ...

  6. C++篇:第十章_命名空间_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十.命名空间 命名空间可以在全局作用域或其他命名空间内部定义,但不能在函数.结构 ...

  7. 如何只用一个小时定制一个行业AI 模型?

    摘要:华为云通过ModelArts Pro提供更多的行业套件和工作流可以供用户直接使用,进一步降低AI行业落地难度,让传统企业客户无需掌握算法知识亦可实现自身业务与AI技术的融合. 去年,在华为开发者 ...

  8. 解密Prompt系列23.大模型幻觉分类&归因&检测&缓解方案脑图全梳理

    上一章我们主要聊聊RAG场景下的幻觉检测和解决方案,这一章我们单独针对大模型的幻觉问题,从幻觉类型,幻觉来源,幻觉检测,幻觉缓解这四个方向进行整理.这里就不细说任意一种方法了,因为说不完根本说不完,索 ...

  9. lab3 page tables

    1.Speed up system calls (easy) 要求:有些操作系统(例如 Linux)通过在用户空间和内核之间的只读区域共享数据来加速某些系统调用.这样可以消除在执行这些系统调用时进行内 ...

  10. 【django-vue】登录注册模态框分析 登录注册前端页面 腾讯短信功能二次封装 短信验证码接口 短信登录接口 短信注册接口

    目录 昨日回顾 csrf跨站请求伪造 接口幂等性 异常捕获 今日内容 1 登录注册模态框分析 Login.vue Header.vue 2 登录注册前端页面复制 2.0 Header.vue 2.1 ...