python代码获取zabbix上机器磁盘使用率

news/2024/11/5 20:10:39 标签: python, zabbix

1.需要先给机器打上标记os_type: Linux或者os_type: Windows
在这里插入图片描述
2.代码请求获取数据:

先装一下相关的数据包 pip install pyzabbix

from pyzabbix import ZabbixAPI
import requests
import urllib3
import concurrent.futures


class ZabbixInfo():
    def __init__(self, zabbix_server, zabbix_user, zabbix_password):
        self.zabbix_server = zabbix_server
        self.zabbix_user = zabbix_user
        self.zabbix_password = zabbix_password


def get_hosts_disk_space_utilization(zabbix_info: ZabbixInfo):
    host_disks_data_list = []
    session = requests.Session()
    # 忽略 SSL 验证的设置
    session.verify = False
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    # 连接到 Zabbix API
    zapi = ZabbixAPI(zabbix_info.zabbix_server, session=session)
    zapi.login(zabbix_info.zabbix_user, zabbix_info.zabbix_password)

    # 获取所有主机
    hosts = zapi.host.get(output=['hostid', 'name'], selectInterfaces=[
        'interfaceid', 'ip'], selectTags='extend',
        selectParentTemplates=['templateid', 'name'])

    # 多线程处理获取数据功能
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # 提交任务并获取 Future 对象
        futures = [executor.submit(get_host_disk_info, host, zapi)
                   for host in hosts]
        # 收集所有返回值
        for future in concurrent.futures.as_completed(futures):
            host_disks_data_list.append(future.result())

    zapi.user.logout()
    return host_disks_data_list


def get_host_disk_info(host, zapi):
    hostid = host['hostid']
    # hostname = host['name']
    host_ip = host['interfaces'][0]['ip']
    host_disk_info_list = []

    tags = host.get('tags', [])
    os_type = 'Linux'
    # 默认是 Linux,获取机器的类型
    for tag in tags:
        if tag['tag'] == 'os_type' and tag['value'] == 'Windows':
            os_type = 'Windows'
            break
    diskset = set()
    # 获取机器的磁盘列表
    # lld_items = zapi.discoveryrule.get(
    #     hostids=hostid, search={'key_': 'vfs.fs.discovery'}, output=['itemid', 'name'])
    # for lld_item in lld_items:
    lld_results = zapi.item.get(hostids=hostid, output=[
                                'itemid', 'name', 'key_', 'lastvalue'])
    for result in lld_results:
        if 'vfs.fs.size' in result['key_']:
            fsname = result['key_'].split('[')[1].split(',')[0]
            # print(f"Host: {hostname} - OS: {os_type} - Filesystem: {fsname}")
            # 提取文件系统名称
            if 'Windows' == os_type or ('Linux' == os_type and str(fsname).startswith('/net') and str(fsname).endswith('/fs0')):
                diskset.add(fsname)

    # 多线程处理获取disk实际数据功能
    host_data_dict = {}
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # 提交任务并获取 Future 对象
        futures = [executor.submit(
            do_get_disk_info, host_disk_info_list, disk, hostid, zapi) for disk in diskset]
        # 收集所有返回值
        for future in concurrent.futures.as_completed(futures):
            host_data_dict = {host_ip: future.result()}

    return host_data_dict


def do_get_disk_info(host_disk_info_list, disk, hostid, zapi):
    oid = 'vfs.fs.size[%s,pused]' % disk
    items = zapi.item.get(hostids=hostid, search={'key_': oid}, output=[
        'itemid', 'name', 'lastvalue'])
    if items:
        for item in items:
            # print(f"Host: {hostname} ({os_type}) - Item: {item['name']} - Last Value: {item['lastvalue']}")
            # print(
            #     f"Host: {hostname} ({os_type}) - {item['name']}: {item['lastvalue']}")
            host_disk_info_list.append({item['name']: item['lastvalue']})
    return host_disk_info_list


if __name__ == "__main__":
    zabbix_info_list = []
    zabbix_disk_info_list = []
    zabbix_info_list.append(ZabbixInfo(
        'http://xxxxxxxxxx',  'username', 'password'))
    zabbix_info_list.append(ZabbixInfo(
        'http://xxxxxxxxxxxxxx',  'username', 'password'))
    for zabbix in zabbix_info_list:
        zabbix_disk_info_list.append(get_hosts_disk_space_utilization(zabbix))
    for item in zabbix_disk_info_list:
        print(item)

最后的数据结构如下,这是我自己定义的,当然可以自己动代码进行修改
在这里插入图片描述


http://www.niftyadmin.cn/n/5739823.html

相关文章

云账户:电商平台的财务管家

在电子商务蓬勃发展的今天,电商平台作为连接商家与消费者的桥梁,承担着繁重的资金流转任务。如何高效、合规地处理交易资金,成为电商平台提升竞争力、优化用户体验的关键。云账户分账系统的出现,为电商平台提供了强大的资金流转解…

【Spring】Spring的简单创建和使用

前言 Spring Bean 可以通过两种主要方式定义&#xff1a;基于 XML 配置文件和基于注解。今天我们讲解基于 XML 配置文件‌来定义 Bean &#xff0c;在 XML 配置文件中&#xff0c;使用 <bean> 元素定义 Bean&#xff0c;描述 Bean 的创建、配置和依赖关系&#xff0c;并存…

基于VsCode platformio的stm32开发环境搭建

背景 VsCode作为当下流行的编辑器&#xff0c;且不单单是一个编辑器里面集成了很多插件&#xff0c;使用这些插件可以完成很多功能。 STM32开发环境除了KEIL与IAR&#xff0c;其实还有很多其他的开方方式&#xff0c;ST官方提供了很多的开发软件&#xff0c;基于Eclipse也可以…

Docker LLama-Factory vLLM 快速部署Meta-Llama-3.1-70B-Instruct

Dockerfile: FROM kevinchina/deeplearning:llamafactory20241027# 设置工作目录 WORKDIR /app# 暴露端口 EXPOSE 8000 EXPOSE 7860# 使用 JSON 格式的 ENTRYPOINT,指定要执行的命令 ENTRYPOINT ["vllm", "serve", "/data/xiedong/LLM-Research/Me…

2024年10月第4个交易周收盘总结(10月收盘)

计划自己的交易&#xff0c;交易自己的计划! 跟随市场而情绪波动&#xff0c;最终一定会导向失败&#xff01;连续、平稳、冷静地惯彻交易计划&#xff0c;比什么都重要&#xff01; 交易本身是极其简单和清楚的&#xff0c;让事情变复杂的原因不是行情走势和交易本身&#x…

深入解析:人工智能与机器学习

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 深入解析&#xff1a;人工智能与机器学习 深入解析&#xff1a;人工智能与机器学习 深入解析&#xff1a;人工智能与机器学习 人…

docker pull 拉取镜像失败,使用Docker离线包

1、登录并注册Github&#xff0c;然后在Github中搜索并打开“wukongdaily/DockerTarBuilder” 项目&#xff0c;在该项目主页点击“Fork”。 然后点 “Create Fork”&#xff0c;将项目创建到自己的Github主页。 2、接着在自己创建过来的这个项目中点击“Actions” 3、然后…

轻松搞定项目管理!用对在线项目管理工具助你生产力翻倍!

一、引言 在线项目管理是指借助互联网平台和相关软件工具&#xff0c;对项目从启动到结束的全过程进行规划、组织、协调、控制和监督的一种管理方式。它打破了传统项目管理在时间和空间上的限制&#xff0c;使得项目团队成员无论身处何地&#xff0c;都能实时同步项目信息、协…