• zabbix配置钉钉报警


    一.  通过关键字方式报警:

            1.  在钉钉中创建一个群聊:

            2.  在群聊中添加一个机器人:在" 群设置 -- 智能群助手 -- 添加机器人 -- 选择自定义机器人 --填入机器人的信息 "。

     Webhook一定要妥善保存。

            3.  配置钉钉报警的脚本:

    1. ##将脚本写在/usr/lib/zabbix/alertscripts/目录下
    2. [root@zabbix ~]# cd /usr/lib/zabbix/alertscripts/
    3. ##安装python3
    4. [root@zabbix alertscripts]# yum install python3
    5. [root@zabbix alertscripts]# vim ding.py
    6. #!/usr/bin/env python3
    7. #zabbix钉钉报警
    8. import requests,json,sys,os,datetime
    9. ##刚刚保存的Webhook
    10. webhook="https://oapi.dingtalk.com/robot/send?
    11. access_token=46108713e975eb4fb1db581eb04bf66a7e03ab9ad85665c59307094277ef9220"
    12. user=sys.argv[1] ##执行脚本时传递的第一个参数,发送用户
    13. text=sys.argv[3] ##执行脚本时传递的第三个参数,发送内容
    14. data={
    15. "msgtype": "text",
    16. "text": {
    17. "content": text
    18. },
    19. "at": {
    20. "atMobiles": [
    21. user
    22. ],
    23. "isAtAll": False
    24. }
    25. }
    26. headers = {'Content-Type': 'application/json'}
    27. x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
    28. if os.path.exists("/usr/lib/zabbix/logs/dingding.log"):
    29. f=open("/usr/lib/zabbix/logs/dingding.log","a+")
    30. else:
    31. f=open("/usr/lib/zabbix/logs/dingding.log","w+")
    32. f.write("\n"+"--"*30)
    33. if x.json()["errcode"] == 0:
    34. f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"发送成功"+"\n"+str(text))
    35. f.close()
    36. ##为脚本添加执行权限
    37. [root@zabbix alertscripts]# chmod +x ding.py
    38. ##修改脚本的属主和属组:
    39. [root@zabbix alertscripts]# chown zabbix.zabbix ding.py

            4.  创建日志文件:

    1. [root@zabbix alertscripts]# mkdir -p /usr/lib/zabbix/logs/
    2. [root@zabbix alertscripts]# touch /usr/lib/zabbix/logs/dingding.log
    3. [root@zabbix alertscripts]# chown zabbix.zabbix -R /usr/lib/zabbix/logs/

             5.  测试脚本是否能运行成功:

    [root@zabbix alertscripts]# ./ding.py a b "zabbix: 这是测试"

             6.  配置zabbix报警:

                    1>.  创建报警媒介类型:

                     2>.  用户关联报警媒介:

     

                    3>.  配置报警动作:

     

             7.  模拟触发触发器,观察是否会发送信息:

    二.  通过加签方式报警: 

            1.  修改机器人配置为加签方式:在" 群设置 -- 智能群助手 --  选择刚刚的机器人 -- 安全设置点击加签 "。

     Webhook不变,加签一定要妥善保存。

            2.  安装pip,pip是python的包管理器

    1. ## 下载pip安装脚本
    2. [root@zabbix ~]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    3. ## 安装python3.8
    4. [root@zabbix ~]# dnf install python38
    5. ## 运行安装脚本
    6. [root@zabbix ~]# python3.8 get-pip.py

            3.  创建钉钉发送日志文件路径:

    1. [root@zabbix ~]# touch /var/log/zabbix/zabbix_ding.log
    2. [root@zabbix ~]# chown zabbix.zabbix /var/log/zabbix/zabbix_ding.log

             4.  创建配置文件zabbix_ding.conf,在/etc/zabbix目录下:

    1. [root@zabbix ~]# vim /etc/zabbix/zabbix_ding.conf
    2. [config]
    3. ## 日志文件
    4. log_path=/var/log/zabbix/zabbix_ding.log
    5. ## 钉钉机器人 webhook 值
    6. webhook=https://oapi.dingtalk.com/robot/send?
    7. access_token=46108713e975eb4fb1db581eb04bf66a7e03ab9ad85665c59307094277ef9220
    8. ## 安全设置 -- 加签
    9. secret=SECd5752bd347a6bdcb07cee150062c25501c57755a796459532c5c0fcf5b07e163

             5.  配置钉钉报警的脚本:

    1. [root@zabbix ~]# cd /usr/lib/zabbix/alertscripts/
    2. [root@zabbix alertscripts]# vim zabbix_ding.py
    3. #!/usr/bin/env python3
    4. # coding:utf8
    5. #
    6. import configparser
    7. import os
    8. import time
    9. import hmac
    10. import hashlib
    11. import base64
    12. import urllib.parse
    13. import requests
    14. import json
    15. import sys
    16. config = configparser.ConfigParser()
    17. config.read('/etc/zabbix/zabbix_ding.conf', encoding='utf-8')
    18. log_path = config.get('config', 'log_path')
    19. api_url = config.get('config', 'webhook')
    20. api_secret = config.get('config', 'secret')
    21. log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    22. # 钉钉机器人文档说明
    23. # https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
    24. def get_timestamp_sign():
    25. timestamp = str(round(time.time() * 1000))
    26. secret = api_secret
    27. secret_enc = secret.encode('utf-8')
    28. string_to_sign = '{}\n{}'.format(timestamp, secret)
    29. string_to_sign_enc = string_to_sign.encode('utf-8')
    30. hmac_code = hmac.new(secret_enc, string_to_sign_enc,
    31. digestmod=hashlib.sha256).digest()
    32. sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    33. return timestamp, sign
    34. # 获取加签后的链接
    35. def get_signed_url():
    36. timestamp, sign = get_timestamp_sign()
    37. webhook = api_url + "×tamp=" + timestamp + "&sign=" + sign
    38. return webhook
    39. # 定义消息模式
    40. def get_webhook(mode):
    41. if mode == 0: # only 关键字
    42. webhook = api_url
    43. elif mode == 1 or mode == 2: # 关键字和加签 或 # 关键字+加签+ip
    44. webhook = get_signed_url()
    45. else:
    46. webhook = ""
    47. print("error! mode: ", mode, " webhook : ", webhook)
    48. return webhook
    49. def get_message(text, user_info):
    50. # 和类型相对应,具体可以看文档 :https://dingdoc.dingtalk.com/doc#/serverapi2/qf2nxq
    51. # 可以设置某个人的手机号,指定对象发送
    52. message = {
    53. "msgtype": "text", # 有text, "markdown"、link、整体跳转ActionCard 、独立跳转ActionCard、FeedCard类型等
    54. "text": {
    55. "content": text # 消息内容
    56. },
    57. "at": {
    58. "atMobiles": [
    59. user_info,
    60. ],
    61. "isAtAll": False # 是否是发送群中全体成员
    62. }
    63. }
    64. return message
    65. # 消息发送日志
    66. def log(info):
    67. if os.path.exists(log_path):
    68. log_file = open(log_path, "a+")
    69. else:
    70. log_file = open(log_path, "w+")
    71. log_file.write(info)
    72. def send_ding_message(text, user_info):
    73. # 请求的URL,WebHook地址
    74. # 主要模式有 0 : 关键字 1:# 关键字 +加签 3:关键字+加签+IP
    75. webhook = get_webhook(1)
    76. # 构建请求头部
    77. header = {
    78. "Content-Type": "application/json",
    79. "Charset": "UTF-8"
    80. }
    81. # 构建请求数据
    82. message = get_message(text, user_info)
    83. # 对请求的数据进行json封装
    84. message_json = json.dumps(message)
    85. # 发送请求
    86. info = requests.post(url=webhook, data=message_json, headers=header).json()
    87. code = info["errcode"]
    88. errmsg = info["errmsg"]
    89. if code == 0:
    90. log(log_time + ":消息已发送成功 返回信息:%s %s\n" % (code, errmsg))
    91. else:
    92. log(log_time + ":消息发送失败 返回信息:%s %s\n" % (code, errmsg))
    93. print(log_time + ":消息发送失败 返回信息:%s %s\n" % (code, errmsg))
    94. exit(3)
    95. if __name__ == "__main__":
    96. text = sys.argv[3]
    97. user_info = sys.argv[1]
    98. send_ding_message(text, user_info)

            6.  为脚本添加执行权限:

    1. [root@zabbix alertscripts]# chown zabbix.zabbix zabbix_ding.py
    2. [root@zabbix alertscripts]# chmod +x zabbix_ding.py

            7.  测试脚本是否能执行成功:

    [root@zabbix alertscripts]# ./zabbix_ding.py zhang li "监控测试"

            8.  配置zabbix监控:步骤和方式一一致,但是报警信息中就不需要再加入关键词" zabbix "

            9.  模拟触发触发器,观察是否会发送信息:

     

  • 相关阅读:
    [附源码]计算机毕业设计JAVA基于JSP社区生鲜配送系统
    去除重复数据
    ROS小车——编写launch文件(8)【ROS保姆注释教学】
    Oracle中 NOT IN 优化
    SolidWorks二次开发语法技巧及基础
    好用的项目管理软件需要满足哪些条件?
    银河麒麟、中标麒麟学习实操资料汇总(含V4、V7、V10)
    新增TOP!10月SCI/SSCI/EI刊源表已更新!
    Linux下vscode终端无法显示和输入
    Jupyter的下载与安装
  • 原文地址:https://blog.csdn.net/NancyLCL/article/details/127768223