利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警

由于移动云的带宽配额时不时调整,且只在带宽下调的情况下会有公告告知,这就导致了无法第一时间了解到哪些节点带宽配额满足业务需求,而且手动查询节点带宽配额需要一个个节点切换查询,非常麻烦
为了解决这些问题,本文利用移动云提供的python sdk 编写取值脚本,再利用zabbix的外部脚本监控的方式调用该脚本进行取值和大屏展示,并配置当前后2次取值不一样的时候通过企微进行告警通知。
1.节点带宽配额监控部署
1.1 安装zabbix
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker/
docker compose -f ./docker-compose_v3_ubuntu_mysql_latest.yaml up -d
容器启动完成后,会在compose文件所在的目录下 创建zbx_env目录,里面存放zabbix数据,其中有两个目录后面需要用到
当前宿主机所在的目录compose所在的目录为/root/zabbix-docker,那2个目录路径分别为
/root/zabbix-docker/zbx_env/usr/lib/zabbix/externalscripts/ # 存放外部检测脚本
/root/zabbix-docker/zbx_env/usr/lib/zabbix/alertscripts/ # 存放告警脚本
1.2 安装pyhton3环境
进入zabbix server 容器内部
docker exec -u 0 -it zabbix-docker-zabbix-server-1 /bin/bash
容器内添加ubuntu源
cat << EOF > /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
EOF
安装python
apt update
apt-get install python3 python3-pip python3.12-venv
#创建虚拟环境
python3 -m venv ecloud
source ecloud/bin/activate
#安装移动云pyhton sdk
pip install -i https://ecloud.10086.cn/api/query/developer/nexus/repository/python-sdk/simple ecloudsdkcore
pip install -i https://ecloud.10086.cn/api/query/developer/nexus/repository/python-sdk/simple ecloudsdkeip
1.3 获取移动云AK/SK
基于安全考虑,建议创建一个RAM用户,使用RAM的AK/SK来进行取值,创建的RAM用户只给与EIP:CreateFloatingIP的权限即可
访问 https://ecloud.10086.cn/api/page/op-aksk-static/#/ 点击【开始使用RAM用户AccessKey】
创建完成后记得复制对应的信息

访问 https://ecloud.10086.cn/api/page/op-ram-static/#/authorization-tactics/manage?lang=zh-CN 创建授权 ,配置模式选json,内容修改为如下内容
{
"version" : "v1",
"statement" : [ {
"effect" : "ALLOW",
"action" : [ "EIP:CreateFloatingIP" ],
"resource" : [ ],
"condition" : { }
} ]
}

1.4 部署节点带宽配额取值Python脚本
修改下面的Python代码中的AK和SK,然后将修改的程序上传到宿主机的/root/zabbix-docker/zbx_env/usr/lib/zabbix/externalscripts/ 目录下,并给与执行权限
chmox +x /root/zabbix-docker/zbx_env/usr/lib/zabbix/externalscripts/get_bw_quota.py
#!/var/lib/zabbix/ecloud/bin/python
# coding: utf-8
import sys
from typing import List
from ecloudsdkcore.config.config import Config
from ecloudsdkeip.v1.model import *
from ecloudsdkeip.v1.client import Client
class GetQuotaIpBwSample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key: str,
access_secret: str,
pool_id: str
) -> Client:
config = Config(
access_key=access_key,
secret_key=access_secret,
pool_id=pool_id
)
return Client(config)
@staticmethod
def main(
args: List[str]
) -> None:
if len(args) < 1:
raise ValueError("Please provide the pool_id as a command-line argument.")
pool_id = args[0]
client = GetQuotaIpBwSample.create_client("你的AK", "你的SK", pool_id)
result = client.get_quota_ip_bw()
bandwidth_quantity = result.body.bandwidth_quantity
print(f"{bandwidth_quantity}")
if __name__ == '__main__':
GetQuotaIpBwSample.main(sys.argv[1:])
2.配置zabbix监控
2.1 监控项配置
zabbix默认账号密码 Admin zabbix
首次登录如果是英文界面,可以通过【Users】--【Users】,点击【Admin】用户,在Language中选择chinese,点击【Update】 就可以更新为中文版了
先创建一个主机,【数据采集】--【主机】--【创建主机】
- 主机名称:ecloud
- 主机群组:随便选一个

创建完,点击对应主机的监控项,创建对应的监控项,点击刚才创建的主机后面的 【监控项】,进入监控项页面,点击右上角【添加监控项】
- 名称:随便写一个,为了辨识,建议用节点名称
- 键值:pyhton程序的名字+[节点编码]
- 更新间隔:多久取值一次,更新间隔不用太频繁,改为1h或者更长的间隔

信息填写完后,可以点击【测试】--【获取值并进行测试】,能正常获取到值就可以添加了

把要监控的节点都添加了

添加完成后,可以在【监测】--【最新数据】 ,筛选出刚才添加的主机,全选所有监控项,点击立即执行,可以看到获取到对应带宽配额值

2.2 监控仪表盘配置
【仪表盘】右上角,点击【编辑仪表盘】

选择【蜂窝视图】,监控项模式选中所有的节点监控项,点击【高级配置】,主标签,文本修改为{ITEM.NAME},二级标签中 小数点改为0


2.3 带宽配额变动微信告警配置
配置告警媒介
【告警】--【媒介】,右上角添加媒介
- 名称:企业微信
- 类型:脚本
- 脚本名称:wechat.py
- 脚本参数:{ALERT.MESSAGE}

获取企业微信群机器人的webhook
在企业微信中创建微信群,并添加群机器人,复制其webhook地址,后续代码需要添加该地址
企业微信告警代码
将下面的代码保存在宿主机的/root/zabbix-docker/zbx_env/usr/lib/zabbix/alertscripts/ 目录下,文件名为wechat.py 并添加执行权限。注意记得修改代码中的webhook地址,改成自己的机器人地址
chmod +x /root/zabbix-docker/zbx_env/usr/lib/zabbix/alertscripts/wechat.py
#!/var/lib/zabbix/ecloud/bin/python
# coding: utf-8
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
def msg(text):
json_text = {
"msgtype": "text",
"text": {
"content": text,
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
if __name__ == '__main__':
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=675ad4b9-8966-4f9c-808d-80fa597c756b" #webhook地址
text = sys.argv[1]
msg(text)
给用户添加报警媒介
【用户】--【用户】,点击对应的用户,选【报警媒介】 类型 企业微信,收件人 随便写一个

配置告警触发器
【数据采集】--【主机】 找到之前创建的主机,点【触发器】,右上角添加触发器
- 名称:移动云-XX-节点带宽配额变动
- 表达式:点【添加】,监控项,选对应监控项,功能选择【change()】,结果选择【<>】 0,点【插入】
按照上面步骤,添加所有节点的触发器

配置触发器动作
【告警】--【动作】--【触发器动作】,右上角【创建动作】
- 名称:随便填一个
- 条件:主机 等于 ecloud
- 操作:发送给用户选 有添加报警媒介的用户
- 媒介类型:企业微信
- 消息:自定义消息内容
{TRIGGER.NAME}
-----
当前节点:{ITEM.NAME}
当前配额:{ITEM.LASTVALUE}
当前时间:{EVENT.DATE}- {EVENT.TIME}
-----


按照上面步骤操作完成后,只要当监控数值有变化,就会自动通过企业微信进行告警(以下图片为测试的值)
