当前位置: 首页 > news >正文

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

一,前言

有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_IDHOST_NAME=$(_jq '.host')#echo $HOST_NAME# Step 4: 获取CPU和内存的itemidITEMID_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_CPUITEMID_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_AVGMEM_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 $Messagecurl -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 -e00 12 * * * bash /shell/zabbix_monitor.sh

相关文章:

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

一,前言 有zabbix监控,也并不是时刻盯着数据,所以想着,每天固定某个时刻,自动发送服务器数据到指定群组,给其他人更直观的数据。 数据就可以从zabbix API获取。参考官方API文档:https://www.z…...

【spring】maven引入okhttp的日志拦截器打开增量注解进程

HttpLoggingInterceptor 是在logging-interceptor库中的:这个logging库老找不到 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor;发现这仨是独立的库 pom中三个依赖 <!-- OKHTTP3 --><...

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台

在当今高速发展的信息技术领域&#xff0c;特别是对于那些致力于前沿科技探索与实践的高校而言&#xff0c;拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台&#xff08;Data Network Development Platform&#xff0c;简称DNDP&#xff09;&am…...

Jenkins Docker Pipeline Clone Build Deploy mysqldump

本文首发在这里 先决条件 装好 Docker 的 Ubuntu钉钉机器人 Webhook curl -H Content-Type:application/json -d {"msgtype":"text","text":{"content":"hello world"}} https://oapi.dingtalk.com/robot/send?access_t…...

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性&#xff0c;以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题&#xff1f; 安全数据交换系统主要解…...

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置&#xff1a; 拖动后播放位置&#xff1a; 在Slider组件中&#xff0c;添加onChange方法进行监听&#xff0c;当视频轨道拖放结束时&#xff0c;触发this.seekTo()函数&#xff0c;其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…...

pointer-events

认识pointer-events属性 pointer-events是一个 CSS 属性&#xff0c;用于控制元素在鼠标事件中的表现。 一、可能的值 auto&#xff08;默认值&#xff09;&#xff1a; 元素对鼠标事件的响应正常。鼠标可以与该元素进行交互&#xff0c;如点击、悬停等。none&#xff1a; 元素…...

RAG 在企业应用中落地的难点与创新分享

在2024稀土开发者大会-AI Agent与应用创新分会上&#xff0c;我有幸分享了我们团队在企业应用中实施RAG&#xff08;检索增强生成&#xff09;的难点与创新。希望通过这篇文章&#xff0c;与大家探讨我们在实践中遇到的问题和解决方案&#xff0c;为从事相关工作的朋友提供一些…...

苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群

SEO优化和搜索引擎的友好性常常是网站管理员关注的重点。苹果CMS&#xff08;maccmscn&#xff09;和海洋CMS都是国内常见的CMS平台&#xff0c;但在搜索引擎优化&#xff08;SEO&#xff09;和百度收录方面&#xff0c;苹果CMS凭借其优秀的插件生态系统&#xff0c;特别是泛目…...

高教社杯数模竞赛特辑论文篇-2013年B题:碎纸复原模型与算法

目录 摘要 一、问题重述 二、问题分析 三、符号说明与模型假设 3.1 符号说明 3.2 模型假设 3.3 假设说明 四、模型的建立与求解 4.1 一维碎纸复原模型 4.1.1 图像的预处理 4.1.2 碎纸特征的提取 4.1.3 基于文字特征的识别序列 4.1.4 碎纸距离的定义 4.1.5 复原 TSP 问题 4.1.6 …...

多线程面试题-28问

1、查询Java有哪些线程&#xff1f; public class MultiThread {public static void main(String[] args) {// 获取 Java 线程管理 MXBeanThreadMXBean threadMXBean ManagementFactory.getThreadMXBean();// 不需要获取同步的 monitor 和 synchronizer 信息&#xff0c;仅获…...

golang学习笔记16——golang部署与运维全攻略

推荐学习文档 golang应用级os框架&#xff0c;欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…...

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

———————————————————————————————————————— 本文为Unreal Fest Shanghai2024讲座内容笔记&#xff0c;非本人所著&#xff0c;原演讲人李文磊。 ————————————————————————————————————————…...

【机器学习-四-无监督学习unsupervise learning-聚类算法简介】

无监督学习unsupervise learning 聚类聚类的过程相似度度量方法聚类的方法划分式层次聚类基于密度的聚类 上一节讲的无监督学习&#xff0c;但是很多人可能会很疑惑&#xff0c;没有目标&#xff0c;那算法是怎么学会该怎样分类的呢&#xff1f;今天就简介一下其中的聚类算法。…...

IPv6路由基础

RIPng RIPng是一种较为简单的内部网关协议&#xff0c;是RIP在IPv6网络中的应用。RIPng主要用于规模较小的网络中&#xff0c;比如校园网以及结构较简单的地区性网络。由于RIPng的实现较为简单&#xff0c;在配置和维护管理方面也远比OSPFv3和IS-IS for IPv6容易&#xff0c;因…...

uniapp开发微信小程序 嵌套(uniapp开发/其他)H5,H5点击跳转微信小程序页面(通信

环境&#xff1a; uniapp开发微信小程序&#xff0c;嵌套webview&#xff0c;H5页面也是用的uniapp框架开发&#xff0c;H5页面点击商品后&#xff0c;需要跳转到微信小程序的详情页面 做法的原因 在微信小程序中使用web-view元素&#xff0c;如果要实现 H5到小程序的通信&am…...

VM虚拟机器配置网络DHCP服务

1、VM虚拟机器网络配置&#xff0c;centos 精简版没有配合网卡&#xff0c;如何配置网络 一、查看网卡信息 使用ip addr或ifconfig -a命令查看系统中现有的网卡设备名称&#xff0c;通常可能是eth0、ens33等类似的名称。 二、编辑网络配置文件 网络配置文件通常位于/etc/syscon…...

使用 jd.item_get API打造可读性商品介绍

在数字化时代&#xff0c;电子商务的蓬勃发展使得商品信息的获取变得至关重要。对于电商平台而言&#xff0c;如何准确、快速地获取商品信息&#xff0c;并以吸引人的方式呈现给消费者&#xff0c;成为提高销售额和用户体验的关键。本文将介绍如何利用 jd.item_get API 获取商品…...

java 通过文件下载地址读取文件内容

需求&#xff1a;读取文件内容&#xff0c;已知文件下载地址 需要引入pdfbox依赖 <dependency> <groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency>Override pub…...

打造古风炫酷个人网页:用HTML和CSS3传递笔墨韵味

需要用到的背景大家可以自己找喜欢的风格!!! 当然俺把俺用的背景放到文章最后了哦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 感谢关注和支持 长期更新哦~~~ 1. 简洁的页面布局&#xff1a;保持优雅和对称 在古风设计中&#xff0c;布局的对称性非常重要…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...