当前位置: 首页 > 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;布局的对称性非常重要…...

vLLM-v0.17.1详细步骤:SSH远程部署+Jupyter可视化结果分析全流程

vLLM-v0.17.1详细步骤&#xff1a;SSH远程部署Jupyter可视化结果分析全流程 1. vLLM框架简介 vLLM是一个专注于大语言模型(LLM)推理和服务的高性能开源库。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在已经发展成为一个活跃的社区驱动项目&#xf…...

NaViL-9B效果对比图:同一图片下temperature=0与0.5响应差异

NaViL-9B效果对比图&#xff1a;同一图片下temperature0与0.5响应差异 1. 模型简介 NaViL-9B是由专业研究机构开发的原生多模态大语言模型&#xff0c;具备强大的文本理解和图像分析能力。该模型支持纯文本问答和图片理解两种主要功能&#xff0c;能够处理复杂的多模态任务。…...

SDMatte镜像轻量化:去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB

SDMatte镜像轻量化&#xff1a;去除冗余依赖、多阶段构建、镜像体积压缩至3.2GB 1. 项目背景与挑战 SDMatte是一款面向高质量图像抠图的AI模型&#xff0c;特别擅长处理复杂边缘和半透明物体的抠图任务。在电商、设计、内容创作等领域有着广泛的应用场景。然而&#xff0c;原…...

自动化数据清洗:OpenClaw+nanobot处理混乱的Excel表格

自动化数据清洗&#xff1a;OpenClawnanobot处理混乱的Excel表格 1. 为什么需要自动化数据清洗 作为一名经常处理外包数据的自由职业者&#xff0c;我每天都要面对各种来源混乱的Excel表格。这些表格往往存在表头不规范、格式不统一、缺失值等问题。传统的手动清洗不仅耗时耗…...

import/export:前端模块化实战|JS 基础语法与数据操作篇

【ES Modules】前端模块化实战&#xff1a;从代码拆分逻辑到落地实操&#xff0c;彻底搞懂import/export的最佳写法&#xff0c;避开模块化高频坑&#xff01; &#x1f4d1; 文章目录 一、先体验一下&#xff1a;没有模块化有多难受 1.1 一个真实的场景1.2 模块化能做到的三件…...

政务大模型在智能客服中的实践:从架构设计到性能优化

最近在参与一个政务智能客服系统的项目&#xff0c;从零开始基于大模型技术构建了一套服务。政务领域的客服系统和我们常见的电商或通用客服很不一样&#xff0c;它对于准确性、稳定性和安全性的要求极高。今天就来分享一下我们在这个项目中的实践&#xff0c;从架构设计到性能…...

ChatGPT响应延迟优化实战:从架构设计到性能调优

ChatGPT响应延迟优化实战&#xff1a;从架构设计到性能调优 最近在项目里深度集成了ChatGPT的API&#xff0c;发现不少同事都在吐槽&#xff1a;“这玩意儿怎么老是卡卡的&#xff1f;” 尤其是在处理长文本、多轮对话或者高并发请求时&#xff0c;响应延迟的问题尤为突出。作…...

ATtiny85极简Si5351 CLK0驱动:100–150MHz单频点时钟配置

1. 项目概述G1OJS_Tiny_Si5351_CLK0 是一个专为资源极度受限的微控制器&#xff08;如 ATtiny85&#xff09;设计的极简型 Si5351A 时钟发生器驱动库&#xff0c;其核心目标是仅通过最小代码体积实现对 Si5351A 芯片 CLK0 输出引脚的精确频率配置&#xff0c;工作范围严格限定在…...

TI-92 Plus计算器超频改造与硬件分析

1. TI-92 Plus图形计算器硬件分析与超频改造1.1 设备概述与历史背景TI-92 Plus是德州仪器(Texas Instruments)于1999年推出的图形计算器产品&#xff0c;采用摩托罗拉68K系列MC68SEC000处理器作为核心运算单元。该设备采用QWERTY全键盘设计&#xff0c;配备大尺寸LCD显示屏&…...

【农业AI实战权威指南】:Python图像识别精度提升7大关键瓶颈与2024最新调优方案

第一章&#xff1a;农业AI图像识别精度提升的底层逻辑与行业挑战农业AI图像识别并非简单套用通用计算机视觉模型&#xff0c;其精度瓶颈根植于农田场景特有的物理复杂性与数据稀缺性。光照剧烈变化、作物生长阶段连续演化、病斑形态微小且易与阴影/污渍混淆&#xff0c;导致传统…...