<think>我们使用Python3调用Zabbix 5.0 API来查询主机资源使用情况,并将结果导出到Excel。主要步骤包括:
1. 登录Zabbix API获取认证令牌(auth)
2. 构建请求查询主机及其相关监控项(如CPU、内存、磁盘等)
3. 获取监控项的历史数据
4. 将数据整理并导出到Excel
由于监控项可能很多,我们通常需要先获取主机的监控项列表,然后根据监控项的key来获取相应的历史数据。
根据引用[1][2][3],我们可以参考一些已有的实现,但需要注意Zabbix 5.0 API的细节。
具体步骤:
1. 读取配置文件(如config.ini)获取API地址、用户名和密码(如引用[1]所示)
2. 使用requests库发送JSON-RPC请求
3. 查询主机列表,然后查询每个主机的监控项(如CPU利用率、内存使用率等)
4. 获取监控项的历史数据(注意选择合适的时间段和数据类型)
5. 将数据整理成表格形式,并使用pandas或openpyxl导出到Excel
注意:Zabbix API返回的数据可能需要进行处理(如时间戳转换、数值转换等)。
下面我们逐步实现:
### 1. 安装必要的库
```bash
pip install requests pandas openpyxl
```
### 2. 编写代码
#### 2.1 读取配置文件
我们使用configparser读取配置文件,配置文件格式如引用[1]所示。
#### 2.2 定义API请求函数
#### 2.3 登录获取auth令牌
#### 2.4 查询主机列表
#### 2.5 查询主机的监控项
#### 2.6 获取监控项的历史数据
#### 2.7 将数据导出到Excel
### 完整代码示例
```python
import requests
import json
import configparser
import pandas as pd
from datetime import datetime
# 读取配置文件
config = configparser.ConfigParser()
config.read('config.ini')
api_url = config['zabbix']['api_url']
user = config['zabbix']['user']
password = config['zabbix']['password']
excel_file = config['excel']['file_name'] + '.xlsx'
# 定义请求头
headers = {'Content-Type': 'application/json-rpc'}
# 定义API请求函数
def api_request(method, params):
data = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"auth": None,
"id": 1
}
if method != 'user.login':
data['auth'] = auth_token
response = requests.post(api_url, headers=headers, data=json.dumps(data))
return response.json()
# 登录获取auth令牌
auth_token = api_request('user.login', {'user': user, 'password': password})['result']
# 获取主机列表
hosts = api_request('host.get', {
'output': ['hostid', 'host', 'name'],
'selectInterfaces': ['ip']
})['result']
# 我们关注的主机资源监控项key(根据实际情况调整)
item_keys = [
'system.cpu.util[,idle]', # CPU空闲率
'vm.memory.size[available]', # 可用内存
'vfs.fs.size[/,free]', # 根分区空闲空间
]
# 创建一个空的DataFrame来存储所有数据
all_data = []
# 遍历每个主机
for host in hosts:
hostid = host['hostid']
hostname = host['host']
# 获取每个监控项的itemid
for key in item_keys:
items = api_request('item.get', {
'hostids': hostid,
'filter': {'key_': key},
'output': ['itemid', 'name', 'key_', 'value_type']
})['result']
if not items:
continue
item = items[0]
itemid = item['itemid']
# 获取历史数据(这里获取最近一小时的数据,按需调整)
history = api_request('history.get', {
'itemids': itemid,
'output': 'extend',
'sortfield': 'clock',
'sortorder': 'DESC',
'limit': 10 # 获取最近10条记录
})['result']
# 处理每条历史记录
for record in history:
# 转换时间戳
time_str = datetime.fromtimestamp(int(record['clock'])).strftime('%Y-%m-%d %H:%M:%S')
value = record['value']
# 添加到数据列表
all_data.append({
'host': hostname,
'item_name': item['name'],
'key': key,
'time': time_str,
'value': value
})
# 创建DataFrame
df = pd.DataFrame(all_data)
# 导出到Excel
df.to_excel(excel_file, index=False, engine='openpyxl')
print(f"数据已导出到 {excel_file}")
```
### 注意事项
1. 上述代码仅获取了最近10条记录作为示例,实际应用中可以根据需要调整时间范围和记录条数。
2. 监控项key需要根据实际Zabbix模板中的key来设置,不同环境可能不同。
3. 如果监控项很多,可能需要分批次获取,避免一次请求数据量过大。
4. 对于数值处理,注意单位(如内存可能为字节,需要转换为GB等)。
### 配置文件示例(config.ini)
```ini
[zabbix]
api_url = http://your_zabbix_server/api_jsonrpc.php
user = your_username
password = your_password
[excel]
file_name = 主机资源使用情况
```
### 相关问题
1. 如何提高从Zabbix API获取数据的效率?
2. 如何处理Zabbix API返回的大量历史数据?
3. 如何将Zabbix监控项的值转换为更易读的单位(如GB、百分比等)?
4. 如何定时执行此Python脚本以实现自动化报表?
5. 在Zabbix API中,如何查询特定时间范围内的历史数据平均值?</think>### Python3调用Zabbix 5.0 API查询主机资源使用情况并导出Excel
#### 1. **准备工作**
- 安装所需库:
```bash
pip install requests pandas openpyxl configparser
```
- 创建配置文件 `config.ini`(参考引用[1]):
```ini
[zabbix]
api_url = http://your_zabbix-server/api_jsonrpc.php
user = your_username
password = your_password
[excel]
file_name = 主机资源使用情况报告
```
#### 2. **完整代码实现**
```python
import requests
import json
import pandas as pd
import configparser
from datetime import datetime
# 读取配置
config = configparser.ConfigParser()
config.read('config.ini')
API_URL = config['zabbix']['api_url']
USER = config['zabbix']['user']
PASSWORD = config['zabbix']['password']
EXCEL_FILE = config['excel']['file_name'] + '.xlsx'
# 认证获取token
def get_auth_token():
payload = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": USER,
"password": PASSWORD
},
"id": 1,
"auth": None
}
response = requests.post(API_URL, json=payload).json()
return response['result']
# 获取主机资源数据
def get_host_resources(auth_token):
# 获取主机列表
hosts_payload = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["hostid", "host"],
"selectItems": ["itemid", "name", "key_"]
},
"auth": auth_token,
"id": 1
}
hosts = requests.post(API_URL, json=hosts_payload).json()['result']
# 定义监控项key(根据实际环境调整)
item_keys = [
'system.cpu.util[,idle]', # CPU空闲率
'vm.memory.size[available]', # 可用内存
'vfs.fs.size[/,free]', # 磁盘空闲空间
'system.uptime' # 运行时间
]
# 获取监控项数据
resource_data = []
for host in hosts:
host_data = {"主机名": host['host']}
for item in host['items']:
if item['key_'] in item_keys:
# 获取最新值
item_payload = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": ["lastvalue"],
"itemids": item['itemid']
},
"auth": auth_token,
"id": 1
}
value = requests.post(API_URL, json=item_payload).json()['result'][0]['lastvalue']
host_data[item['name']] = value
resource_data.append(host_data)
return resource_data
# 主流程
if __name__ == "__main__":
auth_token = get_auth_token()
resources = get_host_resources(auth_token)
# 导出Excel
df = pd.DataFrame(resources)
df.to_excel(EXCEL_FILE, index=False, engine='openpyxl')
print(f"数据已导出至: {EXCEL_FILE}")
```
#### 3. **关键功能说明**
1. **认证流程**:
- 使用 `user.login` 方法获取认证令牌(auth token)
- 后续所有请求需在Header中包含此token
2. **数据查询**:
- 通过 `host.get` 获取主机列表及关联监控项
- 筛选关键资源监控项(CPU/内存/磁盘等)
- 使用 `item.get` 获取最新监控值(参考引用[3])
3. **数据处理**:
- 将JSON数据转换为Pandas DataFrame
- 使用Openpyxl引擎导出Excel
#### 4. **自定义监控项**
修改 `item_keys` 变量可添加其他资源监控:
```python
item_keys = [
'system.cpu.load[percpu,avg1]', # CPU负载
'vfs.fs.inode[/,pfree]', # inode使用率
'net.if.in[eth0]' # 网络流量
]
```
#### 5. **高级功能扩展**
1. **时间范围查询**:
```python
# 在item.get请求中添加时间范围
"params": {
"output": "extend",
"itemids": itemid,
"time_from": int(datetime(2023,1,1).timestamp()),
"time_till": int(datetime.now().timestamp())
}
```
2. **性能优化**:
- 使用 `history.get` 批量获取数据(参考引用[2])
- 添加分页查询避免超时
3. **告警状态集成**:
```python
# 添加触发器查询
"method": "trigger.get",
"params": {
"hostids": hostid,
"output": ["description", "priority"]
}
```
### 注意事项
1. **权限问题**:确保API用户有足够权限访问主机数据
2. **监控项差异**:不同Zabbix模板的监控项key可能不同
3. **数据量控制**:大量主机查询时需添加分页参数
4. **错误处理**:建议添加`try-except`处理API超时
> 通过此方案可定期生成主机资源报告,结合Windows任务计划或Linux cron实现自动化监控[^1][^3]。
---
### 相关问题
1. 如何通过Zabbix API查询特定时间段的资源使用趋势?
2. 怎样在导出的Excel中自动标记异常资源值(如CPU>90%)?
3. 如何通过Zabbix API批量添加/修改监控项?
4. 怎样实现Zabbix监控数据的实时可视化?
5. 如何优化Zabbix API查询性能以支持大规模环境?