Zabbix API开发实战,创建报警媒介和代码示例(付源码)

news2024/11/26 13:28:42

Zabbix API开始发挥重要作用,尤其是在Zabbix与第三方软件(如配置和事件管理系统)的集成以及日常任务的自动化方面。如果没有一些自动化,管理对数千台主机的监控是非常困难的。

API是在Zabbix 1.8中引入的,并且已经被广泛使用。所有Zabbix移动客户端都基于API,甚至本地WEB前端也部分建立在API之上。API中间件使架构更加模块化,有助于避免直接调用数据库。

Zabbix API是一个用于管理和监控Zabbix系统的接口。它允许用户通过编程方式访问和操作Zabbix系统的各种功能,如创建和修改主机、触发器和图表,以及检索历史数据和事件,批量操作,第三方软件集成以及其他作用提供可编程接口。

Zabbix API使用JSON-RPC协议进行通信,可以使用HTTP或HTTPS协议进行访问。API可以在Zabbix服务器上启用,以便外部应用程序可以通过API进行访问。

使用Zabbix API的第一步是对接口进行身份验证。可以使用用户名和密码进行身份验证,也可以使用API令牌进行身份验证。API令牌是一种用于身份验证的加密字符串,可以通过Zabbix前端界面生成。

一旦身份验证完成,就可以使用API方法来访问和操作Zabbix系统。API方法可以通过HTTP POST请求进行调用,并提供必要的参数和选项。API方法的响应是一个包含请求结果的JSON对象。

Zabbix API提供两项主要功能:

  1. 远程管理Zabbix配置。
  2. 远程检索配置和历史数据。

Zabbix API的通信协议JSON-RPC

Zabbix API 采用JSON-RPC实现,意味着调用任何函数,都需要发送POST请求,输入输出数据都是以JSON格式。JSON对象用于描述想要做的事情是什么(创建主机,获取图像,更新监控项等)。

采用POST方法向http://example.com/zabbix/api_jsonrpc.php发送此JSON对象。http://example.com/zabbix/是Zabbix前端地址。api_jsonrpc.php是调用API的PHP脚本。可在安装可视化前端的目录下找到。

注:请求除了必须是POST方法之外,HTTP Header Content-Type必须为:application/jsonrequest,application/json-rpc,application/json其中之一。

可以采用脚本或者任何"手动"支持JSON RPC的工具来使用API。而首先需要了解的就是如何验证和如何使用验证ID来获取想要的信息。后面的演示会以Python脚本的例子来呈现API的基本使用。

关于通信协议jsonrpc的介绍请参考文章:《通信协议jsonrpc》

常用的Zabbix API方法

数据流

该图表示使用Zabbix API时的典型数据流。身份验证(方法user.login)是获取身份验证ID所需的强制性步骤。ID允许我们调用API的任何方法,前提是我们有足够的权限。

以下为常用的zabbix API方法

1. host.get - 获取主机列表

该方法用于获取Zabbix系统中的所有主机列表。可以通过指定过滤条件来限制返回的主机列表。

2. item.get - 获取监控项列表

该方法用于获取Zabbix系统中所有监控项的列表。可以通过指定过滤条件来限制返回的监控项列表。

3. trigger.get - 获取触发器列表

该方法用于获取Zabbix系统中所有触发器的列表。可以通过指定过滤条件来限制返回的触发器列表。

4. graph.get - 获取图表列表

该方法用于获取Zabbix系统中所有图表的列表。可以通过指定过滤条件来限制返回的图表列表。

5. history.get - 获取历史数据

该方法用于获取Zabbix系统中某个监控项的历史数据。可以通过指定过滤条件来限制返回的历史数据。

6. dhost.get – 主机发现

这个方法允许根据给定的参数检索发现的主机。

通过编程实现API调用

 

zabbix的API请求使用的协议是jsonrpc,所以请求参数的格式需要满足jsonrpc的格式。以下是通过编程实现的一些示例

示例1:获取zabbix server的版本-apiinfo.version

get_version.py

import requests
# python中的dict类型要转换json格式的数据需要用到json库
import json

# 要访问的地址
url = 'http://{HOSTNAME}/zabbix/api_jsonrpc.php'

# 请求头部信息
headers = {'Content-Type': 'application/json-rpc'}

data = {
    # jsonrpc协议的版本号,固定的
    "jsonrpc": "2.0",
    # API调用方法,参考zabbix手册,查询zabbix版本
    "method": "apiinfo.version",
    # 没有额外参数
    "params": [],
	# 对应的请求的标示符
    "id": 1
}

# 使用requests发送请求,访问指定网站,向url发送data请求,r收到的返回响应为json格式
# 将data转成json格式,zabbix要求提交的数据是json格式
results = requests.post(url, headers=headers, data=json.dumps(data))
# 将json格式解码,zabbix返回的数据都是json格式
print(results.status_code, results.json())

输出结果示例:

200 {'jsonrpc': '2.0', 'result': '5.0.33', 'id': 1}

示例2:认证,根据用户名和密码获取token-user.login

在你可以访问zabbix任何内部数据之前,你需要登录并获得身份验证令牌,这个可以通过user.login方法来完成,任何Zabbix API客户端在真正工作之前都需要验证它自身。user.login这个方法接受一个用户名和密码作为参数并返回验证ID,一个安全哈希串用于持续的API调用(在使用user.logout之前该验证ID均有效)。

from http_request import http_post
# 导入封装的网络请求方法http_post

url = 'http://{HOSTNAME}/zabbix/api_jsonrpc.php'
username = 'Admin'
password = 'zabbix'

def user_login():
    """
    用户登录,获取token
    """
    payload = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {"user": username, "password": password},
        "id": 1,
        "auth": None,
    }
    resp = http_post(url, data=payload)

    token = resp.get("result")
    if not token:
        print(u"Zabbix账号密码不正确,请输入管理员账号密码")
    return token


if __name__ == '__main__':
    print(user_login())

输出结果示例:

754f3bf4fe41eff7e97b6e18027f6021

示例3:获取特定主机的CPU使用率-item.get

我们现在有一个有效的用户身份验证令牌,可用于在Zabbix中访问数据。

from http_request import http_post
from get_token import user_login

author = user_login()
url = 'http://{HOSTNAME}/zabbix/api_jsonrpc.php'

data = {
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
        "output": ["itemid", "name"],
        "hostids": "10084",
        "search": {"key_": "system.cpu.util[,user]"}
    },
    "auth": author,
    "id": 1
}

response = http_post(url, data=data)
# 输出示例:{'jsonrpc': '2.0', 'result': [{'itemid': '29171', 'name': 'CPU user time'}], 'id': 1}
itemids = [item.get('itemid') for item in response.get('result', [])]

for itemid in itemids:
    data = {
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            "itemids": itemid,
            "history": 0,
            "sortfield": "clock",
            "sortorder": "DESC",
            "limit": 1
        },
        "auth": author,
        "id": 2
    }
    response = http_post(url, data=data)
    # 输出示例:{'jsonrpc': '2.0', 'result': [{'itemid': '29171', 'clock': '1682061011', 'value': '1.381076', 'ns': '272095768'}], 'id': 2}
    print(response.get('result')[0]['value'])

示例4:通过API创建主机监控-host.create

from zabbix_api.get_token import user_login, http_post

def host_create():
    payload = {
        "jsonrpc": "2.0",
        "method": "host.create",
        "params": {
            "host": "server3",
            "interfaces": [
                {
                    "type": 1,
                    "main": 1,
                    "useip": 1,
                    "ip": "192.168.1.130",
                    "dns": "",
                    "port": "10050"
                }
            ],
            "groups": [
                {
                    "groupid": "2"
                }
            ],
            "templates": [
                {
                    "templateid": "10001"
                }
            ]
        },
        "id": 2,
        "auth": user_login()
    }
    resp = http_post(data=payload)
    print('create mediatype', resp)

if __name__ == '__main__':
    host_create()

创建后的主机

示例5:获取所有主机列表示例-host.get

import requests
from get_token import user_login

url = 'http://{HOSTNAME}/zabbix/api_jsonrpc.php'

headers = {'Content-Type': 'application/json-rpc'}

data = {
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": ["hostid", "host"],
        "selectInterfaces": ['interfaceid', "ip"]
    },
    "auth": user_login(),
    "id": 1
}

response = requests.post(url, headers=headers, json=data)
print(response.json())

输出结果示例:

{'jsonrpc': '2.0', 'result': [{'hostid': '10084', 'host': 'Zabbix server', 'interfaces': [{'interfaceid': '1', 'ip': '127.0.0.1'}]}], 'id': 1}

使用host.del还可以删除主机,参数如下

{

    "jsonrpc": "2.0",

    "method": "host.del",

    "params": [

        "10307"

    ],

    "id": 2,

    "auth":"77962d5eaaf442111fe69cc3b9bc488e"

}

示例6:获取事件信息-event.get

from zabbix_api.get_token import user_login, http_post

def event_get():
    payload = {
        "jsonrpc": "2.0", "method": "event.get",
        "params": {
            "output": "extend",
            "select_acknowledges": "extend",
            "selectTags": "extend",
            "selectSuppressionData": "extend",
            "objectids": "13926",
            "sortfield": ["clock", "eventid"],
            "sortorder": "DESC"
        },
        "id": 1,
        "auth": user_login()
    }
    resp = http_post(data=payload)
    print('event_get', resp)


if __name__ == '__main__':
    event_get()

示例7:使用pyzabbix库对接Zabbix API获取主机列表

pyzabbix:pyzabbix 是一个 Python 模块,它提供了一个简单的接口来调用 Zabbix API。您可以在以下链接中找到 pyzabbix 的文档和示例:https://pypi.org/project/pyzabbix/1.0.0/

以下是一个简单的 Python 代码示例,用于使用 pyzabbix 模块连接到 Zabbix API 并获取主机列表:

本示例代码使用最新的Python3.11

from pyzabbix import ZabbixAPI

zabbix_server = 'http://{HOSTNAME}/zabbix/api_jsonrpc.php'
zabbix_user = "Admin"
zabbix_password = "zabbix"

zapi = ZabbixAPI(zabbix_server)
zapi.login(zabbix_user, zabbix_password)

hosts = zapi.host.get(output="extend")
for host in hosts:
    print(host)
    print(host["hostid"], host["host"])

输出结果

{'hostid': '10084', 'proxy_hostid': '0', 'host': 'Zabbix server', 'status': '0', 'disable_until': '1684919414', 'error': 'Received empty response from Zabbix Agent at [127.0.0.1]. Assuming that agent dropped connection because of access permissions.', 'available': '2', 'errors_from': '1682070619', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'Zabbix server', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1', 'inventory_mode': '-1'}

10084 Zabbix server

{'hostid': '10438', 'proxy_hostid': '0', 'host': 'windows10', 'status': '0', 'disable_until': '0', 'error': '', 'available': '0', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'SteveRocket', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1', 'inventory_mode': '-1'}

10438 windows10

{'hostid': '10439', 'proxy_hostid': '0', 'host': 'VM-1-86-centos', 'status': '0', 'disable_until': '0', 'error': '', 'available': '1', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'VM-1-86-centos-1.86', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1', 'inventory_mode': '-1'}

10439 VM-1-86-centos

 

案例1:使用API创建动作、报警媒介和用户

通过封装zabbix API,实现zabbix通过脚本的方式进行报警媒介通知,支持告警媒介的查询、删除、创建,以及创建消息模板,告警用户的查询、删除、创建,动作的查询、删除、创建,用以接入第三方应用告警。

配置-动作

创建的动作与媒介和用户进行绑定

zabbix_api/api_action.py

from zabbix_api.http_request import http_post
from zabbix_api import script_name, media_name, user_name, action_name, ACTION_MESSAGE_BODY
from zabbix_api.get_token import user_login
from zabbix_api.api_mediatype import mediatype_get
from zabbix_api.api_user import user_get

token = user_login()
PARAM = int("11")


def action_get():
    payload = {
        "jsonrpc": "2.0",
        "method": "action.get",
        "params": {
            "output": "actionids",
            "filter": {"name": action_name},
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('get action', resp)
    return [i["actionid"] for i in resp["result"]]


def action_delete(action_ids):
    """
    删除mediatype
    """
    payload = {"jsonrpc": "2.0", "method": "action.delete", "params": action_ids, "auth": token, "id": 1}
    resp = http_post(data=payload)
    print('delete action', resp)


def action_create():
    """创建触发器"""
    userid = user_get()
    if userid and isinstance(userid, list):
        userid = userid[0]
    mediatypeid = mediatype_get()
    if mediatypeid and isinstance(mediatypeid, list):
        mediatypeid = mediatypeid[0]
    payload = {
        "jsonrpc": "2.0",
        "method": "action.create",
        "params": {
            "name": action_name,
            "eventsource": 0,
            "status": 0,
            "esc_period": 3600,
            "def_shortdata": action_name + " {TRIGGER.NAME}: {TRIGGER.STATUS}",
            "def_longdata": ACTION_MESSAGE_BODY,
            "filter": {
                "evaltype": 0, 
                "conditions": [
                    {
                        "conditiontype": 16, 
                        "operator": PARAM,
                        "value": "",  
                    },
                ],
            },
            "operations": [
                {
                    "operationtype": 0, 
                    "esc_period": 0,
                    "esc_step_from": 1,
                    "esc_step_to": 1,
                    "evaltype": 0,
                    "opmessage_usr": [{"userid": userid}],
                    "opmessage": {"default_msg": 1, "mediatypeid": mediatypeid},
                }
            ],
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('create action', resp)


if __name__ == '__main__':
    action_ids = action_get()
    action_delete(action_ids)
    action_create()

管理-报警媒介类型

通过API获取报警媒介、删除报警媒介、创建报警媒介脚本

zabbix_api/api_mediatype.py

from zabbix_api.http_request import http_post
from zabbix_api import script_name, media_name, action_name, ACTION_MESSAGE_BODY
from zabbix_api.get_token import user_login

token = user_login()


def mediatype_get():
    """
    获取mediatype
    """
    payload = {
        "jsonrpc": "2.0",
        "method": "mediatype.get",
        "params": {
            "output": "mediatypeid",
            "filter": {"description": media_name},
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('get mediatype', resp)
    return [i["mediatypeid"] for i in resp["result"]]


def mediatype_delete(media_type_ids):
    """
    删除mediatype
    """
    payload = {
        "jsonrpc": "2.0",
        "method": "mediatype.delete",
        "params": media_type_ids,
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('delete mediatype', resp)


def mediatype_create():
    """
    创建脚本
    """
    exec_params = [
        "{ALERT.MESSAGE}",
    ]
    payload = {
        "jsonrpc": "2.0",
        "method": "mediatype.create",
        "params": {
            "name": media_name,
            "description": media_name,
            "exec_path": script_name,
            "exec_params": "\r\n".join(exec_params) + "\r\n",
            "type": 1, 
            "status": 0, 
            "message_templates": [
                {
                    "eventsource": 0,
                    "recovery": 0,
                    "subject": action_name + " {TRIGGER.NAME}: {TRIGGER.STATUS}",
                    "message": ACTION_MESSAGE_BODY,
                }
            ],
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('create mediatype', resp)


if __name__ == '__main__':
    mediatype_ids = mediatype_get()
    mediatype_delete(mediatype_ids)
    mediatype_create()

获取报警媒介输出结果:{'jsonrpc': '2.0', 'result': [{'mediatypeid': '29'}], 'id': 1}

删除报警媒介输出结果:{'jsonrpc': '2.0', 'result': {'mediatypeids': ['29']}, 'id': 1}

创建报警媒介输出结果:{'jsonrpc': '2.0', 'result': {'mediatypeids': ['30']}, 'id': 1}

管理-用户

将创建的用户和媒介进行关联一起。

zabbix_api/api_user.py

from zabbix_api.http_request import http_post
from zabbix_api import password, usrgrpid, script_name, media_name, user_name, action_name, ACTION_MESSAGE_BODY
from zabbix_api.get_token import user_login
from zabbix_api.api_mediatype import mediatype_get

token = user_login()


def user_get():
    """
    获取以前老的mediatype
    """
    payload = {
        "jsonrpc": "2.0",
        "method": "user.get",
        "params": {
            "output": "userid",
            "filter": {"alias": user_name},
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('get user', resp)
    return [i["userid"] for i in resp["result"]]


def user_delete(user_ids):
    """
    删除mediatype
    """
    payload = {"jsonrpc": "2.0", "method": "user.delete", "params": user_ids, "auth": token, "id": 1}
    resp = http_post(data=payload)
    print("delete user", resp)


def user_create():
    """创建用户"""
    mediatypeid = mediatype_get()[0]
    if mediatypeid and isinstance(mediatypeid, list):
        mediatypeid = mediatypeid[0]
    payload = {
        "jsonrpc": "2.0",
        "method": "user.create",
        "params": {
            "alias": user_name,
            "name": user_name,
            "surname": user_name,
            "passwd": password,
            "type": 3,
            "usrgrps": [{"usrgrpid": usrgrpid}],
            "user_medias": [
                {
                    "mediatypeid": mediatypeid,
                    "sendto": user_name,
                    "active": 0,
                    "severity": 63,
                    "period": "1-7,00:00-24:00",
                }
            ],
        },
        "auth": token,
        "id": 1,
    }
    resp = http_post(data=payload)
    print('create user', resp)


if __name__ == '__main__':
    user_ids = user_get()
    user_delete(user_ids)
    user_create()

创建主方法create_alarm_mediatype.py

from zabbix_api.api_mediatype import mediatype_get, mediatype_delete, mediatype_create
from zabbix_api.api_user import user_get, user_delete, user_create
from zabbix_api.api_action import action_get, action_delete, action_create

action_ids = action_get()
if action_ids:
    action_delete(action_ids)

mediatype_ids = mediatype_get()
if mediatype_ids:
    mediatype_delete(mediatype_ids)

user_ids = user_get()
if user_ids:
    user_delete(user_ids)

mediatype_create()
user_create()
action_create()

初始输出

get action {'jsonrpc': '2.0', 'result': [{'actionid': '35'}], 'id': 1}
delete action {'jsonrpc': '2.0', 'result': {'actionids': ['35']}, 'id': 1}
get mediatype {'jsonrpc': '2.0', 'result': [{'mediatypeid': '36'}], 'id': 1}
delete mediatype {'jsonrpc': '2.0', 'result': {'mediatypeids': ['36']}, 'id': 1}
get user {'jsonrpc': '2.0', 'result': [{'userid': '36'}], 'id': 1}
delete user {'jsonrpc': '2.0', 'result': {'userids': ['36']}, 'id': 1}
create mediatype {'jsonrpc': '2.0', 'result': {'mediatypeids': ['37']}, 'id': 1}
get mediatype {'jsonrpc': '2.0', 'result': [{'mediatypeid': '37'}], 'id': 1}
create user {'jsonrpc': '2.0', 'result': {'userids': ['37']}, 'id': 1}
get user {'jsonrpc': '2.0', 'result': [{'userid': '37'}], 'id': 1}
get mediatype {'jsonrpc': '2.0', 'result': [{'mediatypeid': '37'}], 'id': 1}
create action {'jsonrpc': '2.0', 'result': {'actionids': [36]}, 'id': 1} 

执行成功后,查看创建的动作

查看创建的用户

查看创建的报警媒介

案例2:获取zabbix的告警数据,并通知微信机器人

代码示例

from zabbix_api import username, password, url
import json
import datetime
import requests
from pyzabbix import ZabbixAPI

boturl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*****************"
headers = {'Content-Type': 'application/json;charset=utf-8'}


def msg(text):
    json_text = {
        "msgtype": "text",
        "text": {
            "content": text
        },
    }
    print(requests.post(boturl, json.dumps(json_text), headers=headers).content)


def alert_msg():
    # zabbix地址和登录信息
    ZABBIX_SERVER = url
    zapi = ZabbixAPI(ZABBIX_SERVER)
    zapi.login(username, password)

    # 获取告警信息
    alert_list = zapi.trigger.get(
        output=[
            "triggerid",  # 触发器id
            "description",  # 触发器内容描述
            "priority",  # 触发器等级1-5  5最大 信息、警告、一般严重、严重、灾难
        ],
        filter={
            "value": 1  # 过滤,此处表示启动的触发器
        },
        sortfield="priority",  # 排序
        sortorder="DESC",  # 正排与倒排
        min_severity=2,  # 返回指定告警级别的告警,这里是大于等于告警
        skipDependent=1,  # 跳过依赖于其他问题中的触发器
        monitored=1,  # 属于受监控主机的已启用触发器,并仅包含已启用的项目
        active=1,  # 只返回属于受监控主机的启用的触发器(与上条意思差不多,至于什么区别,未测)
        expandDescription=1,  # 在触发器的名称中展开宏
        selectHosts=['name'],  # 在结果中返回关联的主机信息(意思就是显示出那台主机告警的)
        selectGroups=['name'],  # 在结果中返回关联的主机组信息(意思就是显示出那个主机组告警的)
        only_true=1  # 只返回最近处于问题状态的触发器
    )
    now_date = datetime.datetime.now()
    info = ''
    info += '当前存在告警:\n' + str(now_date)
    for i in alert_list:
        info += '\n\n名称:' + i['hosts'][0]['name'] + '\n告警内容:' + i['description']
    msg(info)


if '__main__' == __name__:
    alert_msg()

机器人收到的消息如下

总结

使用Zabbix API可以让用户更方便地管理和监控Zabbix系统,同时还可以与其他应用程序进行集成。要使用Zabbix API,需要了解API的基本概念和方法,并了解如何使用API进行身份验证和访问。

参考链接

Zabbix API:Zabbix 提供了 API,可以通过 Python 调用 API 来操作 Zabbix。您可以在以下链接中找到有关 Zabbix API 和 Python 的详细信息:https://www.zabbix.com/documentation/current/manual/api

公众号后台回复【zabbix代码示例】

 


更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q

推荐阅读:

Docker容器系列

云主机-生产环境下离线安装Docker部署应用
https://blog.csdn.net/zhouruifu2015/article/details/77850885

一、Docker:Linux/Windows在线安装Docker与命令大全总结.
https://blog.csdn.net/zhouruifu2015/article/details/129630908

二、Docker:Dockerfile的使用、指令详解和示例
https://blog.csdn.net/zhouruifu2015/article/details/129630891

三、Docker:Compose安装、使用、文件结构、配置参数与命令详解
https://blog.csdn.net/zhouruifu2015/article/details/129631372

Kubernetes系列

四、Kubernetes(K8S):kubectl概述、安装、设置
https://blog.csdn.net/zhouruifu2015/article/details/130057847

五、Kubernetes(K8S):Kubectl常用命令详解
https://blog.csdn.net/zhouruifu2015/article/details/130056507

云原生开源项目-Go进阶:总结19款Go语言日常开发中使用到的热门开源项目
https://blog.csdn.net/zhouruifu2015/article/details/130732734

Prometheus监控系列

一、Prometheus:配置、导航栏、Template和启动参数详解  
https://blog.csdn.net/zhouruifu2015/article/details/129558351

二、Prometheus:告警特性、配置与绑定Alertmanager详解(1)  
https://blog.csdn.net/zhouruifu2015/article/details/129583555

三、Prometheus:告警规则集、告警接收器、Alertmanager启动参数详解(2)  
https://blog.csdn.net/zhouruifu2015/article/details/129626005

四、Prometheus:使用Exporter监控Windows和Linux以及配置加密认证  
https://blog.csdn.net/zhouruifu2015/article/details/129626349

六、 Prometheus:使用Grafana拖拽式创建可视化Dashboard监控平台  
https://blog.csdn.net/zhouruifu2015/article/details/130081266

七、 Prometheus:结合Grafana实现MySQL监控平台  
https://blog.csdn.net/zhouruifu2015/article/details/130081302

Zabbix监控系列

Zabbix之2023 Zabbix6.4最新高级特性、优缺点及其实现原理总结
https://mp.weixin.qq.com/s/rPjlcZtv1pSXwyH62QGHjQ

Zabbix API开发实战,创建报警媒介和代码示例(付源码)
https://mp.weixin.qq.com/s/pSePfSmjMrTb1uTEBL0RBQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多语言电商系统_国际化电商系统流程

跨境电商系统是基于计算机技术和互联网平台的一种电子商务系统。它通常包括前端电商网站或应用程序、后台管理系统、物流管理系统、支付系统等多个模块,可以通过网络实现商品展示、订单管理、支付结算、物流配送等电商流程的自动化处理。 跨境电商系统基本流程包括…

JWT | 一分钟掌握JWT | 概念及实例

作者:Mars酱 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我! 什么是JWT JWT的全称是Json Web Token。是基于RFC 7519开放标准的&#xff…

玩转ChatGPT:视频制作

一、写在前面 最近,在码深度学习图像识别的相关知识和代码,这一part,看看能否用小Chat搞一个介绍视频。 简单问小Chat: 咒语:我怎么使用你做一个视频?需要配合什么软件生成?? 大意…

2023.5.22-5.28 AI行业周刊(第149期):毕业10年后的实验室聚会

周末和实验室,无锡这边师兄弟们相聚了一次,之前在无锡这边的江南大学读书,后来工作后大家大多数也都留在了无锡。 我们研究生时的实验室,专门有一个微信群,从02年入学,到17年入学,多年各界的师…

Node.JS学习 | Babel | webpack | ES6

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Node.JS Node.JS能够在服务器端运行JavaScript的开放源代码、跨平台运行环境;Node.js采用Google开发的V8运行代码,使用事件驱动、非阻塞IO和异…

Python常用数据结构

Python 提供了多种内置的数据结构,用于存储和组织数据。以下是一些常见的 Python 数据结构: 1.列表(List):列表是一个有序、可变的数据集合,可以包含任意类型的元素。列表使用方括号 [] 表示,元…

谷歌周彦祺:LLM浪潮中的女性科学家多面手丨智源大会嘉宾风采

导读 大模型研发竞赛如火如荼,谷歌紧随OpenAI其后推出PalM2、Gemini等系列模型。Scaling Law是否仍然适用于当下的大模型发展?科技巨头与初创企业在竞争中各有哪些优势和劣势?模型研究者应秉持哪些社会责任? 2023智源大会「基础模…

华为OD机试真题B卷 Java 实现【最长的连续子序列】,附详细解题思路

一、题目描述 有N个正整数组成的一个序列,给定一个整数sum,求长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。 二、输入描述 第1行有N个正整数组成的一个序列。 第2行给定一个整数sum。 求最长连续子序列,只要遍历计算连…

补贴平价好书影响上亿读者:有一种力量叫“至拙”

通过一种“至拙”的力量,“多多读书月”带来诸多可喜的变化。 全民拼书:“多多读书月”带来平价好书 如果你也是一位热爱读书的小伙伴,那么想来一定不会不知道“多多读书月”。 2020年,在“三区三州”地区助力脱贫攻坚的公益活动中…

转转前端周刊第六十七期

转转前端周刊 本刊意在将整理业界精华文章给大家,期望大家一起打开视野 如果你有发现一些精华文章想和更多人分享,可以点击我们的公众号名称,将文章链接和你的解读文案发给我们!我们会对内容进行筛选和审核,保留你的推…

详细理解GPT2模型结构及其训练过程—GPT系列训练与部署

本文为博主原创文章,未经博主允许不得转载。 本文为专栏《Python从零开始进行AIGC大模型训练与推理》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/130169592”。 GPT2模型环境搭建与调试请参考博文《GPT系列训练与部署—GPT2环境配…

一分钟学一个 Linux 命令 - ls

前言 大家好,我是 god23bin。今天我给大家带来的是 Linux 命令系列,每天只需一分钟,记住一个 Linux 命令不成问题。今天,我们要介绍的是一个常用而又强大的命令:ls(list)。 什么是 ls 命令&am…

CVPR 2023 | 去雨去噪去模糊,图像low-level任务,视觉AIGC系列

Learning A Sparse Transformer Network for Effective Image Deraining 基于Transformer的方法在图像去雨任务中取得了显著的性能,因为它们可以对重要的非局部信息进行建模,这对高质量的图像重建至关重要。本文发现大多数现有的Transformer通常使用查询…

Linux的进程信号(下)

文章目录 1. 阻塞信号1.1 信号其他相关常见概念1.2 在内核中的表示 2. sigset_t3. 信号集操作函数3.1 sigprocmask3.2 sigpending3.3. 实例演示 4. 信号的处理4.1. sigaction4.2 多个信号的处理 5. 可重入函数6. volatile7. SIGCHLD信号 1. 阻塞信号 1.1 信号其他相关常见概念…

java基于springboot自来水收费缴费系统+jsp

本次设计拟采用JAVA技术,对乡镇自来水收费系统的功能需求进行了全面分析,从模块功能定义、前后端交互技术、数据库及编程语言的选择、系统调试及测试、功能完善和改进等方面进行设计,解决了从用户新装、抄表、计费、收费、复查、换表、发票管…

Pyside6-第三篇-QToolButton一个奇葩的按钮

今天是Pyside6的第三篇内容。一起来看另一个按钮。 QToolButton。 from PySide6.QtWidgets import QToolButton, QWidget, QApplicationapp QApplication([])win QWidget() win.setWindowTitle("QToolButton按钮")btn QToolButton(win) btn.setText("触发&qu…

Cell揭秘--慢性压力如何导致肠道炎症

大脑产生的信号传导到肠道神经细胞,导致炎症化学物质的释放。 溃疡性结肠炎患者的肠道组织(人工着色)。图片来源: Steve Gschmeissner/Science Photo Library 心理压力会加重某些肠道疾病引起的肠道炎症。现在,科学家们找到了原因…

初学QT(Day05)

继续第四天的demo 总结了之前的经验教训,我重新开一个项目项目,先给出demo的结果吧,第一张是第一次写的demo,第二张图是成品的demo 结果还是比较满意的,虽然过程中有遇到的问题不是我自己独立解决的。。。相比于第…

GPT-4能否取代数据分析师?达摩院的初步实验为你解答~

深度学习自然语言处理 原创作者 | 刘嘉玲 最近,数据分析师圈子大家在讨论GPT-4对他们的工作有什么影响:是替代还是辅助?个人认为GPT-4可以帮助我提高工作效率和质量。 要成为一名高级的数据分析师,需要经过长期的学习和实践&#…

无代码玩转GIS应用,我也在行【文末送书】

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…