近期在公司内接到了整合zabbix监控数据接口的需求,故在这几天的时间学习了一下zabbix相关的东西,在这里做一个学习总结。
什么是zabbix
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix由2部分构成,zabbix server与可选组件zabbix agent。 zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD,OS X等平台上。
zabbix环境搭建(以Ubuntu-22.04为例)
- 安装zabbix仓库
# wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
# dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
# apt update
- 安装Zabbix server, frontend, agent
# apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent
- zabbix需要使用数据库,为zabbix创建单独的用户和表
# mysql -uroot -p
password
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
- 在Zabbix服务器主机上导入初始架构和数据。系统将提示您输入新创建的密码。
# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix
- 导入数据库架构后禁用log_bin_trust_function_creators选项。
# mysql -uroot -p
password
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
- 编辑配置文件 /etc/zabbix/zabbix_server.conf
DBPassword=password
- 编辑配置文件 /etc/zabbix/nginx.conf 取消掉下面的注释
# listen 8080;
# server_name example.com;
- 启动Zabbix server和agent进程,并为它们设置开机自启
# systemctl restart zabbix-server zabbix-agent nginx php8.1-fpm
# systemctl enable zabbix-server zabbix-agent nginx php8.1-fpm
此时zabbix的安装已完成,访问ip:8080可以看到zabbix UI
zabbix API
Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于: 创建新的应用程序以使用Zabbix; 将Zabbix与第三方软件集成; 自动执行常规任务。 Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两点: 该API包含一组独立的方法; 客户端和API之间的请求和响应使用JSON格式进行编码。 例如,让我们使用 host.get 方法检索所有已配置主机的ID,主机名和接口 :
# -*- coding:utf-8 -*-
import json
import requests
url = 'http://121.43.148.233:8080/api_jsonrpc.php'
headers = {'Content-Type': 'application/json'}
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2
}
ret = requests.post(url, data=json.dumps(data), headers=headers)
print(ret.text)
此时zabbix做出了如下响应
{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params.","data":"Not authorized."},"id":2}
这是因为我们没有登录就直接访问数据接口,我们首先要通过登录来拿到访问令牌,然后再通过令牌来查询数据
# -*- coding:utf-8 -*-
import json
import requests
url = 'http://121.43.148.233:8080/api_jsonrpc.php'
headers = {'Content-Type': 'application/json'}
login_data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1
}
ret = requests.post(url, data=json.dumps(login_data), headers=headers)
data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": ret.text['result']
}
ret = requests.post(url, data=json.dumps(data), headers=headers)
print(ret.text)
结果如下
[{'hostid': '10084', 'host': 'Zabbix server', 'interfaces': [{'interfaceid': '1', 'ip': '127.0.0.1'}]}]
zabbix社区较为活跃,在python中已有现成的api支持,我们仅需要几行代码便可以实现和上面的代码相同的功能
from pyzabbix import ZabbixAPI
# 连接到Zabbix API
zapi = ZabbixAPI("http://121.43.148.233:8080")
zapi.login("Admin", "zabbix")
# 获取主机列表
hosts = zapi.host.get(
output=["hostid", "host"],
selectInterfaces=["interfaceid", "ip"]
)
print(hosts)