Zabbix配置动作执行远程命令和发送邮件

当有事件发生,我们可以根据事件来执行相应的动作,根据事件来源可以分为触发器动作,自动发现动作,自动注册动作,内部事件动作,自动发现动作在之前的自动发现那里讲过了,这里介绍一下触发器动作,当触发器事件达到执行动作的必要条件,会执行相应的动作

1.配置邮件告警动作

首先创建一个触发器动作,触发报警会发送邮件

定义动作触发条件

定义动作执行的操作,这里是执行发送消息的操作,步骤1-5表示会发送5次消息,默认每次的间隔是30分钟

这里我们定义了1-5步执行的操作,就是每隔30分钟,将消息通过‘zabbix_send.py’这个脚本发送给Admin用户

如果问题两个小时之内没有确认,则会将在两个小时之后每隔十五分钟一次通知zabbix管理组,共发送两次消息

这里看到两个操作的步骤五重叠了,这里较短的自定义步骤持续时间为10分钟的会覆盖较长的步骤持续时间,也就是说第二个操作的5步骤会覆盖第一个操作的5步骤

定义恢复操作,问题解决之后会发送消息给Admin用户

定义更新操作,当其他用户更新问题时收到通知,比如问题被关闭,或者问题严重程度发生变化

到这里动作部分就完成了,如果要让其成功发送邮件,还需要配置用户和报警媒介

配置用户


配置用户报警媒介

配置用户的收件人等信息

创建报警媒介类型


配置报警媒介类型,传入的三个参数分别为收件人,邮件主题,邮件内容

zabbix邮件报警的web界面配置完成了,还需要修改zabbix_server的配置文件,来支持使用脚本
vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
修改完成后重启zabbix-server
在/usr/lib/zabbix/alertscripts目录下添加要使用的报警脚本
并给邮件授予执行权限
chmod +x zabbix_send.py
创建一个graph目录,并授予权限
mkdir graph chmod 777 -R graph

邮件内容及详细注释如下:

#!/usr/bin/python
#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
from smtplib import SMTP

user=‘Admin‘    #定义zabbix用户名
password=‘zabbix‘    #定义zabbix用户密码
graph_path=‘/usr/lib/zabbix/alertscripts/graph‘   #定义图片存储路径
graph_url=‘http://192.168.179.132/chart.php‘     #定义图表的url
#api_url ="http://10.127.0.119/api_jsonrpc.php"    #定义api的url
#header = {"Content-Type":"application/json" }     #定义api的headers
loginurl="http://192.168.179.132/index.php"          #定义登录的url
host=‘192.168.179.132‘
to_email=sys.argv[1]    #传入的第一个参数为收件人邮箱
subject=sys.argv[2]  #传入的第二个参数为邮件主题
subject=subject.decode(‘utf-8‘)
smtp_host = ‘smtp.163.com‘  #定义smtp主机地址
from_email = ‘wanger@163.com‘     #定义发件人地址
mail_pass = ‘asd1234‘       #发件人邮箱校验码

def get_itemid():
    #获取报警的itemid
    itemid=re.search(r‘ITEM 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":"Sign in",
        }
        #定义传入的data
        login=session.post(url=loginurl,headers=loginheaders,data=payload)
        #进行登录
        graph_params={
            "from" :"now-10m",
            "to" : "now",
            "itemids" : itemid,
            "width" : "400",
        }
        #定义获取图片的参数
        graph_req=session.get(url=graph_url,params=graph_params)
        #发送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,"25")   #创建一个smtp对象
        server.starttls()    #启用安全传输模式
        server.login(from_email,mail_pass)  #邮箱账号登录
        server.sendmail(from_email,to_email,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()

2.配置执行远程命令的动作

当触发器达到阈值报警时,我们可以根据相关的报警来执行相关的命令使故障达到自我恢复的效果
这里我举一个ssh端口关闭并执行重启ssh的例子

在系统上配置

在zabbix客户端配置文件中取消注释下面语句,以支持zabbix客户端执行远程命令
vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
zabbix执行远程命令使用的是zabbix用户,确保‘zabbix‘用户具有已配置命令的执行权限。
vim /etc/sudoers
Defaults !requiretty #不需要提示终端登录 zabbix ALL=(ALL) NOPASSWD: ALL #允许‘zabbix‘用户在没有密码的情况下运行所有命令。
配置完成后,使用zabbix-get测试是否可以运行远程命令,如果返回数据,则表示远程命令可用
zabbix_get -s 192.168.179.132 -k "system.run[sudo df -h]"

配置脚本

vim /restart_ssh.sh

#/bin/bash
systemctl restart sshd

对脚本授予可执行权限
chmod +x /restart_sshd.sh

创建ssh的监控项

创建触发器


配置动作

创建动作

配置动作触发条件

配置动作执行的命令,这里为了方便查看效果,延迟两分钟执行

触发报警

这里关闭ssh服务,使报警触发
systemctl stop sshd

报警触发,两分钟后执行脚本

这里可以使用zabbix-get来获取监控的值。来查看是否成功执行命令
zabbix_get -s 192.168.179.132 -k net.tcp.port[192.168.179.132,22]
可以看到,zabbix已经成功执行脚本,重启ssh



欢迎各位关注我的微信公众号“没有故事的陈师傅”

原文地址:https://blog.51cto.com/12970189/2363777

时间: 2024-11-13 03:55:54

Zabbix配置动作执行远程命令和发送邮件的相关文章

Zabbix报警执行远程命令

日常Zabbix报警案例中,大多都是报警发送邮件,场景里很少有需要报警后执行一个命令(启动服务.清空磁盘空间.关停服务器):而今天就给大家讲讲最近需要做的事:报警后执行远程命令 首先讲讲需求吧,  遥远的一天,小伙伴们用上了mongodb,而且需要大力使用,日后一些数据存储在mongodb:从生产环境迁移数据进mongodb,那么问题来了,经常听到别人说,mongodb量大就挂了.mongodb有些数据是在程序当中被引用到,白天某个时刻挂了,那么用户.客服.运营就呼唤着了..团队中也在查问题,找

L15.4 zabbix 自定义执行远程命令与分级报警示例

 zabbix 自定义执行远程命令与分级报警示例 详细选项说明参考之前内容,这里只演示操作过程. 注意事项: operation send message Media Type Email, SMS, Jabber, Script, EZ Texting User remote command (1) 给zabbix定义sudo规则: zabbix ALL=(ALL) ALL (2) 不支持active模式的agent: (3) 不支持代理模式: (4) 命令长度不得超过255个字符: (5)

zabbix action 执行远程命令

今天没事,想研究一下zabbix action执行远程命令,弄了一上午,终于好了.现记录一下,供以后再出现类似问题可以参考.. 首先,我要监控的服务是nginx/mysqld,在要监控的客户端上开启远程执行命令, EnableRemoteCommands=1 然后在客户端上添加权限 命令#visudo 在最后添加 # allows 'zabbix' user to run all commands without password. zabbix ALL=NOPASSWD: ALL #  # a

使用 Socket 执行远程命令

编写一个程序,实现客户端能在服务端远程执行命令,并把命令结果在客户端打印出来 服务端:192.168.5.131客户端:192.168.5.134 [[email protected] ~]# cat client.py #!/usr/bin/env python #-*- coding:utf-8 -*- import sys import tab # tab模块用于让客户端支持命令tab补齐,需要自己编写该模块,参考:tab.py import socket s = socket.socke

Zabbix去执行远程命令

远程命令是一个很棒的功能,试想一下,你正在与甜美娇羞的小娘子兴奋的啪啪啪,突然短信来了,提示服务器里存储空间不够用,你还要翻身下床摸索出笔记本来把这些问题处理掉,处理完毕之后又要重新酝酿情绪,太扫兴了!其实这种一两个命令就能搞定的问题就应该交给Zabbix自己去解决. 我们这里就举一个"监控文件大小"的例子:假设我们把/mnt这个文件夹挂载到数据盘上,如果数据盘存储空间不够用,就要求zabbix远程自动删除一些过期的日志文件,只保留一天以内的日志文件. 于是乎,我们先写一个脚本,名字叫

zabbix执行远程命令

Remote command 最大的好处是什么呢? 是自动.  Zabbix会根据配置的条件,去执行对应的命令,下面看看Remote command的应用场景. 应用无法响应时,自动重启某些应用. 当服务器不响应时,使用IPMI的"reboot"命令重启服务器. 在磁盘要满了的情况下,自动删除一些文件(比如/tmp). 根据CPU负载,自动进行虚拟机调配. 弹性计算,根据系统情况,新增或删除云节点. Zabbix无法通过Zabbix Proxy向Zabbix Agent发送,一定要从Z

zabbix远程命令(remote command)配置

1.zabbix远程命令(remote command): 1.1 功能: 重启服务: 通过IPMI接口重启服务器: 任何自定义脚本可以完成的功能:清理磁盘空间,虚拟机实例迁移等等: 1.2 相关属性: Tatget list:远程命令执行的目标主机,可以实当前主机.其他主机或主机组 Type:命令类型 IPMI:IPMI命令: Custom script:自定义脚本,可以选择其是在zabbix server上还是zabbix agent上执行: SSH:通过ssh执行命令,需要提供目标主机上的

Zabbix远程命令执行失败

前言 问题 : 手机上收到tomcat server[80] down信息,服务down掉,往往都是有重启操作.重启失败才会报警.如果重启操作执行了,我们就需要查看为何不能启动? Trigger: Tomcat service[80]is down Trigger status: PROBLEM Trigger severity: Disaster Trigger URL: Item values: 1. Tomcat status (192.168.96.200:net.tcp.listen[

zabbix添加自定义item、触发器、图形,并执行远端命令

#前言:     粗一看挺复杂的,其实照着步骤做一下,非常简单! #意图:      agentd端监控的服务down掉时,试图将其重启. #环境:        1.VMware12 . CentOS 7.1 . zabbix 2.4.6     2.zabbix server ip :10.10.100.104     3.zabbix agentd ip:10.10.100.105     4.server端和agentd端分别关闭selinux和firewalld: 4.1.vim /e