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

news/2024/12/22 19:01:15/

一,前言

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

http://www.ppmy.cn/news/1528094.html

相关文章

reader-lm:小模型 html转markdown

参考: https://huggingface.co/jinaai/reader-lm-0.5b 在线demo: https://colab.research.google.com/drive/1wXWyj5hOxEHY6WeHbOwEzYAC0WB1I5uA#scrollTo0mG9ISzHOuKK 输入网址:https://www.galaxy-geely.com/E5 结果: 代码…

repo sync 提示输入密码 git@git.xxx.com password

异常现象 一直提示输入密码 djqhuali-virtual-machine:~/mokar/test/project_test$ repo sync gitgit.huali-tec.coms password: Permission denied, please try again. gitgit.huali-tec.coms password:1:前置条件 在使用repo sync之前,请确保 .xml…

Oracle数据库中的Oracle Label Security是什么

Oracle Label Security(OLS)是Oracle数据库中的一个强大特性,它提供了基于标签的行级安全性控制。通过OLS,组织可以实施细粒度的数据访问控制,确保用户只能访问他们被授权的数据。 Oracle Label Security的工作原理 …

推荐几个高质量C/C++项目,全程干货没有废话!

5个项目视频代码都打包好了,需要的朋友来文章底部获取 每年的就业季都有很多同学惆怅,在校期间没有项目经历,简历一片空白,不知道该怎么写。 所以今天为大家盘点了五个C/C项目,由浅入深,既可以作为求职简历…

通往AGI的皇冠:逻辑推理能力

文章来自新浪微博机器学习团队 AI Lab 负责人张俊林,OpenAI发布新模型o1之后的一些观点,很有启发: GPT 4o本质上是要探索不同模态相互融合的大一统模型应该怎么做的问题,对于提升大模型的智力水平估计帮助不大;而o1本…

蓝桥杯4. Fizz Buzz 经典问题

题目描述 给定一个整数 NN,从 1 到 NN 按照下面的规则返回每个数: 如果这个数被 3 整除,返回 Fizz。如果这个数被 5 整除,返回 Buzz如果这个数能同时被 3 和 5 整除,返回 FizzBuzz。如果这个数既不能被 3 也不能被 5…

docker-compose 部署 flink [支持pyflink]

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

PCIe扫盲(11)

系列文章目录 PCIe扫盲(一) PCIe扫盲(二) PCIe扫盲(三) PCIe扫盲(四) PCIe扫盲(五) PCIe扫盲(六) PCIe扫盲(七&#xff09…