哪里建个人网站好,官方网站建设哪家公司好,房产信息网 源码,宣传方式一#xff0c;前言
有zabbix监控#xff0c;也并不是时刻盯着数据#xff0c;所以想着#xff0c;每天固定某个时刻#xff0c;自动发送服务器数据到指定群组#xff0c;给其他人更直观的数据。
数据就可以从zabbix API获取。参考官方API文档#xff1a;https://www.z…一前言
有zabbix监控也并不是时刻盯着数据所以想着每天固定某个时刻自动发送服务器数据到指定群组给其他人更直观的数据。
数据就可以从zabbix API获取。参考官方API文档https://www.zabbix.com/documentation/current/zh/manual/api
二功能实现
主要功能概览
获取cpu和内存的数据可根据实际情况添加其他监控项数据。只需要24小时内最大最小平均数据。只获取群组为prod的主机服务器意味着生产环境。 需要获取主机在zabbix分到同一个组方便获取所有主机信息。
代码步骤概览
获取 Zabbix 认证 Token登录有权限的账户。 user.login方法获取Token。需要注意的是由于安装版本不同API链接可能不同如有些是https://example.com/zabbix/api_jsonrpc.php有些是https://example.com/api_jsonrpc.php获取指定群组中的所有主机获取群组ID。 hostgroup.get方法获取群组ID获取群组内所有主机host.get方法。遍历每个主机获取CPU和RAM的监控项获取需要监控项的itemIDitem.get方法。通过 监控项的itemID获取历史数据记录history.get方法。计算将结果通过媒体发送到指定群组这里为TG群组。
三代码实现
这里使用shell脚本
#!/bin/bash# 信息验证
ZABBIX_URLhttps://zabbix.example.com/api_jsonrpc.php
ZABBIX_GROUPprod # 指定的服务器群组名称
ZABBIX_USERAdmin
ZABBIX_PASSpassoword# TG 群组token和ID
TELEGRAM_BOT_TOKEN5487418237: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_modeMarkdowndone以上代码在调试可以自行去掉 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_modeMarkdown最后运行脚本结果 最后放服务器上设置个定时任务每天自动发送消息。
crontab -e00 12 * * * bash /shell/zabbix_monitor.sh