Python Zabbix API脚本:匹配某个模板下的所有主机信息保存到Excel中

Python3 脚本:脚本里需要定义模板名称

import json
import requests
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Side, Border, PatternFill
import os
import logging


class ZabbixApi:
    def __init__(self):  # 初始化信息
        self.url = 'http://192.10.xxx.xxx/api_jsonrpc.php'
        self.user = 'Admin'
        self.passwd = 'zabbix'
        self.header = {
            'Content-Type': 'application/json-rpc',
            'User-Agent': 'python/pyzabbix',
            'Cache-Control': 'no-cache'
        }

    def UserLogin(self):  # api登录操作
        data = {
            "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": self.user,
                "password": self.passwd
            },
            "id": 0,
        }
        return self.UrlRequest(data)

    def UrlRequest(self, data):  ##
        request = requests.post(url=self.url, data=json.dumps(data), headers=self.header, verify=False)
        response = json.loads(request.text)
        return response['result']

    def GetHost(self, template):
        data = {
            "jsonrpc": "2.0",
            "method": "template.get",
            "params": {
                "output": ['name'],
                "filter": {
                    "host": template
                },
                "selectHosts": ['name']
            },
            "auth": token,
            "id": 1
        }
        return self.UrlRequest(data)

    def writeExcel(self, fileName, ZabbixData):
        WorkBook = Workbook()
        Sheet = WorkBook.active
        Sheet.title = 'HostInfo'
        TableTitle = ['Template_name',"Host_name"]
        TitleColumn = {}
        AllHostItemValues = {}

        for row in range(len(TableTitle)):
            Col = row + 1
            Column = Sheet.cell(row=1, column=Col)
            Column.value = TableTitle[row]
            # TitleCol = Column.coordinate.strip('1')
            # TitleColumn[TableTitle[row]] = TitleCol

        # 整理Zabbix 监控数据逐行写入到表格中
        for hostinfo in ZabbixData.values():

            num = len(hostinfo)
            for i in range(num):
                HostItemValues = []
                HostItemValues.append(hostinfo['name'])  # 模板名称
                HostItemValues.append(hostinfo['hosts'][i]['name'])  # 主机名称
                AllHostItemValues[i] = HostItemValues

        # 将所有信息写入到表格中
        for HostValue in range(len(AllHostItemValues)):
            Sheet.append(AllHostItemValues[HostValue])
            print(AllHostItemValues[HostValue])

        ############ 设置单元格样式 ############
        # 字体样式
        TitleFont = Font(name="宋体", size=12, bold=True, italic=False, color="000000")
        TableFont = Font(name="宋体", size=11, bold=False, italic=False, color="000000")
        # 对齐样式
        alignment = Alignment(horizontal="center", vertical="center", text_rotation=0, wrap_text=True)
        # 边框样式
        side1 = Side(style='thin', color='000000')
        border = Border(left=side1, right=side1, top=side1, bottom=side1)
        # 填充样式
        pattern_fill = PatternFill(fill_type='solid', fgColor='99ccff')
        # 设置列宽
        column_width = {'A': 25, 'B': 25, 'C': 25, 'D': 25, 'E': 25, 'F': 16, 'G': 18, 'H': 18, 'I': 22, 'J': 22,
                        'K': 23,
                        'L': 15, 'M': 16, 'N': 16, 'O': 14, 'P': 16}
        for i in column_width:
            Sheet.column_dimensions[i].width = column_width[i]
        # 设置首行的高度
        Sheet.row_dimensions[1].height = 38
        # 冻结窗口
        Sheet.freeze_panes = 'A2'
        # 添加筛选器
        Sheet.auto_filter.ref = Sheet.dimensions

        # 设置单元格字体及样式
        for row in Sheet.rows:
            for cell in row:
                if cell.coordinate.endswith('1') and len(cell.coordinate) == 2:
                    cell.alignment = alignment
                    cell.font = TitleFont
                    cell.border = border
                    cell.fill = pattern_fill
                else:
                    cell.font = TableFont
                    cell.alignment = alignment
                    cell.border = border
        WorkBook.save(filename=fileName)
        print('Create Yes!')


if __name__ == '__main__':
    zapi = ZabbixApi()
    token = zapi.UserLogin()
    print(f'身份令牌为"{token}"')
    template = 'Template App Zabbix Server'  ### 定义模板名称的参数
    zabbixDict = {}
    zabbixData = zapi.GetHost(template)
    fileName = os.path.join(os.getcwd(), "Hosts" + f'({template})' + '.xlsx')
    print(fileName)
    for info in zabbixData:
        hostid = info['hosts'][0]['hostid']
        zabbixDict[hostid] = info
    zapi.writeExcel(fileName, zabbixDict)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python调用Zabbix API批量主机的信息,您需要进行以下步骤: 1. 安装 `zabbix-api` 模块:您可以使用 `pip` 命令安装该模块,例如:`pip install zabbix-api` 2. 导入必要的库和模块: ```python from pyzabbix import ZabbixAPI import json ``` 3. 创建 `ZabbixAPI` 对象并登录: ```python zabbix_server = "http://zabbix.example.com" zabbix_user = "username" zabbix_password = "password" zapi = ZabbixAPI(url=zabbix_server, user=zabbix_user, password=zabbix_password) zapi.login() ``` 4. 使用 `host.get` 方法批量主机信息: ```python hosts = zapi.host.get(output=['hostid', 'host', 'name', 'status', 'ip']) ``` 此时,变量 `hosts` 将包含所有主机的信息。在这个示例,我们询了每个主机的 `hostid`、`host`、`name`、`status` 和 `ip` 信息。 5. 处理询结果: ```python for host in hosts: print("Host ID:", host['hostid']) print("Host Name:", host['name']) print("Host Status:", host['status']) print("Host IP:", host['ip']) print("------------------------") ``` 以上代码将遍历每个主机,并打印出其 ID、名称、状态和 IP 地址。 完整代码示例: ```python from pyzabbix import ZabbixAPI import json zabbix_server = "http://zabbix.example.com" zabbix_user = "username" zabbix_password = "password" zapi = ZabbixAPI(url=zabbix_server, user=zabbix_user, password=zabbix_password) zapi.login() hosts = zapi.host.get(output=['hostid', 'host', 'name', 'status', 'ip']) for host in hosts: print("Host ID:", host['hostid']) print("Host Name:", host['name']) print("Host Status:", host['status']) print("Host IP:", host['ip']) print("------------------------") ``` 注意:在实际使用,您可能需要根据具体情况修改询的参数和返回结果的处理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值