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

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

由于移动云的带宽配额时不时调整,且只在带宽下调的情况下会有公告告知,这就导致了无法第一时间了解到哪些节点带宽配额满足业务需求,而且手动查询节点带宽配额需要一个个节点切换查询,非常麻烦

为了解决这些问题,本文利用移动云提供的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】

创建完成后记得复制对应的信息

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

访问 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" : { }

  } ]

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

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
  • 主机群组:随便选一个
利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警-一字节.OneByte

创建完,点击对应主机的监控项,创建对应的监控项,点击刚才创建的主机后面的 【监控项】,进入监控项页面,点击右上角【添加监控项】

  • 名称:随便写一个,为了辨识,建议用节点名称
  • 键值:pyhton程序的名字+[节点编码]
  • 更新间隔:多久取值一次,更新间隔不用太频繁,改为1h或者更长的间隔
利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警-一字节.OneByte

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

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

把要监控的节点都添加了

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

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

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

2.2 监控仪表盘配置

【仪表盘】右上角,点击【编辑仪表盘】

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

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

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

2.3 带宽配额变动微信告警配置

配置告警媒介

【告警】--【媒介】,右上角添加媒介

  • 名称:企业微信
  • 类型:脚本
  • 脚本名称:wechat.py
  • 脚本参数:{ALERT.MESSAGE}
利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警-一字节.OneByte

获取企业微信群机器人的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)

给用户添加报警媒介

【用户】--【用户】,点击对应的用户,选【报警媒介】 类型 企业微信,收件人 随便写一个

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

配置告警触发器

【数据采集】--【主机】 找到之前创建的主机,点【触发器】,右上角添加触发器

  • 名称:移动云-XX-节点带宽配额变动
  • 表达式:点【添加】,监控项,选对应监控项,功能选择【change()】,结果选择【<>】 0,点【插入】

按照上面步骤,添加所有节点的触发器

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

配置触发器动作

【告警】--【动作】--【触发器动作】,右上角【创建动作】

  • 名称:随便填一个
  • 条件:主机 等于 ecloud
  • 操作:发送给用户选 有添加报警媒介的用户
  • 媒介类型:企业微信
  • 消息:自定义消息内容
{TRIGGER.NAME}
-----
当前节点:{ITEM.NAME}
当前配额:{ITEM.LASTVALUE}
当前时间:{EVENT.DATE}- {EVENT.TIME}
-----
利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警-一字节.OneByte
利用Zabbix实时监控移动云节点带宽配额变动并通过企业微信发送告警-一字节.OneByte

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

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