获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组

news2024/11/13 18:01:49

一,前言

有zabbix监控,也并不是时刻盯着数据,所以想着,每天固定某个时刻,自动发送服务器数据到指定群组,给其他人更直观的数据。

数据就可以从zabbix API获取。参考官方API文档:https://www.zabbix.com/documentation/current/zh/manual/api

二,功能实现

主要功能概览

  1. 获取cpu和内存的数据(可根据实际情况添加其他监控项数据)。
  2. 只需要24小时内,最大,最小,平均数据。
  3. 只获取群组为prod的主机服务器,意味着生产环境。
    需要获取主机,在zabbix分到同一个组,方便获取所有主机信息。
    在这里插入图片描述

代码步骤概览

  1. 获取 Zabbix 认证 Token(登录有权限的账户)。
    user.login方法,获取Token。需要注意的是,由于安装版本不同,API链接可能不同,如有些是https://example.com/zabbix/api_jsonrpc.php,有些是https://example.com/api_jsonrpc.php
  2. 获取指定群组中的所有主机,获取群组ID。
    hostgroup.get方法,获取群组ID
  3. 获取群组内所有主机,host.get方法。
  4. 遍历每个主机,获取CPU和RAM的监控项,获取需要监控项的itemID,item.get方法。
  5. 通过 监控项的itemID,获取历史数据记录,history.get方法。
  6. 计算将结果通过媒体发送到指定群组(这里为TG群组)。

三,代码实现

这里使用shell脚本

#!/bin/bash

# 信息验证
ZABBIX_URL="https://zabbix.example.com/api_jsonrpc.php"
ZABBIX_GROUP="prod"  # 指定的服务器群组名称
ZABBIX_USER="Admin"
ZABBIX_PASS="passoword"

# TG 群组token和ID
TELEGRAM_BOT_TOKEN="5487418237:AAGibU......."
TELEGRAM_CHAT_ID="-452112...."

# 登录并获取zabbix token
AUTH_TOKEN=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "'$ZABBIX_USER'",
        "password": "'$ZABBIX_PASS'"
    },
    "id": 1
}' $ZABBIX_URL | jq -r '.result')
#echo $AUTH_TOKEN

# Step 1: 获取群组ID
GROUP_ID=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "filter": {
            "name": ["'$ZABBIX_GROUP'"]
        }
    },
    "auth": "'$AUTH_TOKEN'",
    "id": 1
}' $ZABBIX_URL | jq -r '.result[0].groupid')
#echo $GROUP_ID

# Step 2: 获取群组内所有主机
HOSTS=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": ["hostid", "host"],
        "groupids": "'$GROUP_ID'"
    },
    "auth": "'$AUTH_TOKEN'",
    "id": 1
}' $ZABBIX_URL)
#echo $HOSTS

# 时间范围,这里只获取24小时的数据
END_TIME=$(date +%s)
#echo $END_TIME
START_TIME=$((END_TIME - 86400))  # 24小时之前的时间戳
#echo $START_TIME

# Step 3: 遍历每个主机,获取CPU和RAM的监控项数据
for HOST in $(echo "$HOSTS" | jq -r '.result[] | @base64'); do
    _jq() {
        echo ${HOST} | base64 --decode | jq -r ${1}
    }

    HOST_ID=$(_jq '.hostid')
    #echo $HOST_ID
    HOST_NAME=$(_jq '.host')
    #echo $HOST_NAME

    # Step 4: 获取CPU和内存的itemid
    ITEMID_CPU=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "extend",
            "hostids": "'$HOST_ID'",
            "search": {
	        "name": "CPU utilization",
                "key_": "system.cpu.util"
            }
        },
        "auth": "'$AUTH_TOKEN'",
        "id": 1
    }' $ZABBIX_URL | jq -r '.result[0].itemid')
    #echo $ITEMID_CPU

    ITEMID_MEM=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "extend",
            "hostids": "'$HOST_ID'",
            "search": {
                "key_": "vm.memory.utilization"
            }
        },
        "auth": "'$AUTH_TOKEN'",
        "id": 1
    }' $ZABBIX_URL | jq -r '.result[0].itemid')
    #echo $ITEMID_MEM

    # 获取CPU和内存的历史数据
    CPU_DATA=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            "history": 0,
	    "itemids": "'$ITEMID_CPU'",
            "time_from": "'$START_TIME'",
            "time_till": "'$END_TIME'",
	    "sortfield": "clock",
            "sortorder": "DESC"
    },
        "auth": "'$AUTH_TOKEN'",
        "id": 1
    }' $ZABBIX_URL | jq -r '.result[] | .value')

    MEM_DATA=$(curl -s -X POST -H 'Content-Type: application/json' -d '{
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            "history": 0,
            "itemids": "'$ITEMID_MEM'",
            "time_from": "'$START_TIME'",
            "time_till": "'$END_TIME'",
            "sortfield": "clock",
            "sortorder": "DESC"
        },
        "auth": "'$AUTH_TOKEN'",
        "id": 1
    }' $ZABBIX_URL | jq -r '.result[] | .value')

    #获取最新的CPU和内存数值
    LATEST_CPU=$(echo "$CPU_DATA" | head -n 1)
    LATEST_MEM=$(echo "$MEM_DATA" | head -n 1)

    #计算CPU和内存的最大值、最小值和平均值
    CPU_MAX=$(echo "$CPU_DATA" | sort -nr | head -n 1)
    CPU_MIN=$(echo "$CPU_DATA" | sort -n | head -n 1)
    CPU_AVG=$(echo "$CPU_DATA" | awk '{s+=$1} END {printf "%.2f", s/NR}')
    #echo $CPU_MAX
    #echo $CPU_MIN
    #echo $CPU_AVG


    MEM_MAX=$(echo "$MEM_DATA" | sort -nr | head -n 1)
    MEM_MIN=$(echo "$MEM_DATA" | sort -n | head -n 1)
    MEM_AVG=$(echo "$MEM_DATA" | awk '{s+=$1} END {printf "%.2f", s/NR}')
    #echo "$MEM_AVG"

    #格式化为两位小数
    CPU_MAX=$(printf "%.2f" "$CPU_MAX")
    CPU_MIN=$(printf "%.2f" "$CPU_MIN")
    LATEST_CPU=$(printf "%.2f" "$LATEST_CPU")

    MEM_MAX=$(printf "%.2f" "$MEM_MAX")
    MEM_MIN=$(printf "%.2f" "$MEM_MIN")
    LATEST_MEM=$(printf "%.2f" "$LATEST_MEM")

    #发送监控数据到 TG 群组
    MESSAGE="*Server Name(服务器):* $HOST_NAME%0A*CPU utilization 24h(利用率):*%0A- Max(最大): $CPU_MAX%25%0A- Min(最小): $CPU_MIN%25%0A- AVG(平均): $CPU_AVG%25%0A- Current(当前): $LATEST_CPU%25%0A*Memory utilization 24h(内存利用率):*%0A- Max(最大): $MEM_MAX%25%0A- Min(最小): $MEM_MIN%25%0A- AVG(平均): $MEM_AVG%25%0A- Current(当前): $LATEST_MEM%25%"
    #echo $Message

    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
    -d "chat_id=$TELEGRAM_CHAT_ID" \
    -d "text=$MESSAGE" \
    -d "parse_mode=Markdown"

done

以上代码,在调试,可以自行去掉 echo 前面的#。

四,群组输出格式问题

最后代码格式问题,会因所发送的媒体信息不通,代码格式也不同。如以前用/n换行,格式在shell输出没问题,在TG群就不生效。以前参考格式。

    MESSAGE="服务器名称: $HOST_NAME\nCPU 利用率: 最大 $CPU_MAX%, 最小 $CPU_MIN%, 平均 $CPU_AVG%\n内存利用率: 最大 $MEM_MAX%, 最小 $MEM_MIN%, 平均 $MEM_AVG%"

    curl -s -X POST https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage -d chat_id=$TELEGRAM_CHAT_ID -d text="$MESSAGE"

后面改成这样的格式,虽然shell输出格式乱,但是在TG群组输入没问题。

使用Markdown 语法:

使用 * 符号来加粗文本。
使用 - 来列出项目。
确保 TG 处理换行:

将换行符 \n 替换为 %0A,这是 URL 编码的换行符。

    MESSAGE="*Server Name(服务器):* $HOST_NAME%0A*CPU utilization 24h(利用率):*%0A- Max(最大): $CPU_MAX%25%0A- Min(最小): $CPU_MIN%25%0A- AVG(平均): $CPU_AVG%25%0A- Current(当前): $LATEST_CPU%25%0A*Memory utilization 24h(内存利用率):*%0A- Max(最大): $MEM_MAX%25%0A- Min(最小): $MEM_MIN%25%0A- AVG(平均): $MEM_AVG%25%0A- Current(当前): $LATEST_MEM%25%"
    
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
    -d "chat_id=$TELEGRAM_CHAT_ID" \
    -d "text=$MESSAGE" \
    -d "parse_mode=Markdown"

最后运行脚本结果
在这里插入图片描述
最后放服务器上,设置个定时任务,每天自动发送消息。

crontab -e

00 12 * * * bash /shell/zabbix_monitor.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用IIC外设(硬件IIC)

本文重点叙述如何使用芯片自带的 IIC 外设,即硬件 IIC,实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中,叙述了软件 IIC 通信和硬件 IIC 通信的区别, 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢,因此为了方便以后下载就将文件保存到夸克网盘上,链接:我用夸克网盘分享了「git」,点击链接即可保存。 链接:https://pan.quark.cn/s/07c73c4a30…

MongoDB在Linux系统中的安装与配置指南

在这篇文章中,我们将介绍如何在CentOS 7服务器上安装MongoDB,并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …

鸿蒙OS 线程间通信

鸿蒙OS 线程间通信概述 在开发过程中&#xff0c;开发者经常需要在当前线程中处理下载任务等较为耗时的操作&#xff0c;但是又不希望当前的线程受到阻塞。此时&#xff0c;就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制&#xff0c…

Spring Boot助力高校心理辅导系统升级

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

如何着手创建企业数据目录?(三)权限管理及版本控制

前文导读&#xff1a; 《如何着手创建企业数据目录&#xff1f;&#xff08;一&#xff09;数据目录的设定》 《如何着手创建企业数据目录&#xff1f;&#xff08;二&#xff09;数据的命名与维护》 前面聊过了数据目录的设定、数据命名规则和维护规则&#xff0c;今天我们继续…

【java实现json转化为CSV文件】

文章目录 JSON文件中的数据格式测试文件转换的接口 JSON文件中的数据格式 单条数据展开后如下&#xff1a; {"text": "《邪少兵王》是冰火未央写的网络小说连载于旗峰天下","spo_list":[{"predicate": "作者", "objec…

Windows环境下搭建MySQL主从同步实现读写分离

文章目录 前言读写分离的基本原理 环境介绍及说明主库my.ini初始配置创建用于同步的数据库和表 一、新增mysql从库1.复制mysql文件夹2.修改从库的my.ini3.安装到windows服务 二、在my.ini中配置主、从库相关参数1.主库新增配置参数不同版本参数不同问题 2.从库新增配置参数3.删…

rabbitmq 短信验证码

1.生成的验证码用redis存 减少数据库压力 2.通知运营商发送短信的事情交给rabbitmq的队列去做&#xff0c;无论成功或者是失败&#xff0c;用户那边都不知道。没有收到验证码&#xff08;监听失败&#xff09;用户只会觉得是运营商的问题&#xff0c;而不会怀疑是我们的系统有问…

Linux文件IO(四)-返回错误处理与errno详解

1.前言 在上一文章中&#xff0c;给大家编写了很多的示例代码&#xff0c;大家会发现这些示例代码会有一个共同的特点&#xff0c;那就是当判断函数执行失败后&#xff0c;会调用 return 退出程序&#xff0c;但是对于我们来说&#xff0c;我们并不知道为什么会出错&#xff0…

C++进阶|多态知识点详解及经典面试题总结

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数的重写/覆盖 2.3 虚函数重写的⼀些其他问题 2.4 override 和 final关键字 2.5 重载/重写/隐藏的…

(笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数

一.位运算总结: 在解题之前理解一下为什么需要位运算&#xff1f;它的本质是什么&#xff1f; 力扣上不少位运算相关的题&#xff0c;并且很多题也会用到位运算的技巧。这又是为什么&#xff1f; 位运算的由来 在计算机里面&#xff0c;任何数据最终都是用数字来表示的&…

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候&#xff0c;由于数据库的表格中含有中文&#xff0c;在使用mysqldump导出sql语句的时候&#xff0c;中文显示乱码&#xff0c;如下图所示&#xff1a; 环境描述 系统&#xff1a;windows10数据库&#xff1a; Mariadb -10.6.16…

Vue2中路由的介绍和使用

一.路由的基本概念 一说路由&#xff0c;大家首先想到的可能是路由器&#xff0c;路由器的原理就是给连接的设备一个IP地址&#xff0c;通过IP地址来映射到设备&#xff0c;实现连接&#xff0c;本质上是一种映射关系。 在vue2中就是路径与组件间的映射。 路由是使用vue2制作…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页&#xff0c;每个item只有一张图 多页&#xff0c;每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum&#xff1a; 2/发送请求 response requests.get(urlurl, header…

快速将Mongo Compass的shell语句转成java代码

步骤一、从MongoCompass中获取java代码 将java代码复制出来&#xff0c;从MongoCompass中复制的java代码基本格式如下&#xff1a;&#xff08;是Bson原生格式&#xff09; List<Document> list Arrays.asList(new Document("$match",new Document("name…

探索视频美颜SDK与直播美颜工具的开发实践方案

直播平台的不断发展&#xff0c;让开发出性能优异、效果自然的美颜技术&#xff0c;成为了技术团队必须面对的重要挑战。本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的开发实践方案。 一、视频美颜SDK的核心功能 视频美颜SDK是视频处理中的核心组件&#xf…

Cocos Creator3.x设置动态加载背景图并且循环移动

效果图 项目结构 项目层级结构&#xff1a; 预制&#xff1a; 代码 import { _decorator, CCFloat, Component, Node, Sprite, instantiate, Prefab, assert } from cc; const { ccclass, property } _decorator;/*** 背景脚本*/ ccclass(Background) export class Backg…

2024年华为杯研赛(D题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…