美文网首页
zabbix主机item过多导致无法删除

zabbix主机item过多导致无法删除

作者: Big_dimple | 来源:发表于2018-05-16 12:29 被阅读115次

    问题:zabbix上突然发现有台服务器的item监控项通过自动发现规则创建了5w多个监控项。

    解决思路
    1.在web界面将host删除,结果无法删除,点击删除后无反应
    2.在web界面先将模板取消并清理,结果发现取消后,item还是存在,无法删除。
    3.通过脚本使用api删除host,结果发现请求超时,无法从api将主机删除。
    4.通过数据库直接将host删除,但是考虑到数据库会继续保存5w个item,强迫症患者坚决不允许。
    
    于是怀疑是不是由于item有5w多个,倒是zabbix数据库里面无法处理过来。
    然后产生如下思路:
    1.通过web界面每次删除1000个,手动删除。--自动化运维表示这么做太low
    2.通过api接口删除特定主机item,这个可以有,开干!!!
    
    Python脚本
    思路为,获取hostid,根据hostid获取所有的itemid,然后调取api删除所有itemid
    网上看了很多资料,全部都是如何创建item的,没有批量删除的,于是自己写一个
    环境:能联通zabbix_server的主机,python3环境
    执行命令pip install zabbix_api
    脚本如下:
    
    #-*- coding:utf8 -*-
    import json,sys,argparse
    from zabbix_api import ZabbixAPI
    server = "http://xxx.xxx.xxx.xxx/zabbix"
    username = "Admin"
    password = "zabbix"
    zapi = ZabbixAPI(server=server, path="", log_level=0)
    zapi.login(username, password)
    #解析参数
    def get_args():
        parser = argparse.ArgumentParser()
        parser.add_argument("-H", "--host", help="host name")
        args = parser.parse_args()    
        if not args.host:
            args.host = raw_input('host: ')
        return args
    #根据hostname查询hostid  
    def get_host_id(host):
        get_host_id = zapi.host.get(
            {
                "output": "hostid",
                "filter": {
                    "host":host.split(",")
                }
            }
    )
        host_id = []
        host_id.append([I['hostid'] for I in get_host_id])
        return host_id[0]
     #查询host中所有item存入item_id列表中   
    def get_host_item(hosts_id):
        get_item_id = zapi.item.get(
            {
                "output": ["itemid","key_"],
                "hostids": hosts_id,
    #            "filter": {
    #                "host":host.split(",")
                }
        )
        item_id = []
        item_id.append([I['itemid'] for I in get_item_id])   
        return item_id[0]
    #删除host
    def delete_host(hosts_id):
        hosts_delete = zapi.host.delete(hosts_id)
        return "host delete success!"
    #删除host中item
    def delete_host_item(itemid):
        hosts_delete = zapi.item.delete(itemid)
        return "host_item "+itemid[0]+" delete success!"
        
    if __name__ == "__main__":
        args = get_args()   
        host_id = get_host_id(args.host)
        item_id = get_host_item(host_id)
        #此处的for循环是将列表中所有元素全部单个定义为新的列表,然后调取api删除,因为一次5w个item的列表,api请求会超时。
        for i in range(len(item_id)):
            itemid = []
            itemid.append(item_id[i])
            print(delete_host_item(itemid))
        print(delete_host(hosts_id))
    
    重要!!!首先在web界面将template去掉,unlink即可。
    执行方式:python zabbix_del.py --host='test_host' &
    放在后台自己执行了一个小时删除完了。
    

    参考文章:https://www.zabbix.com/documentation/3.4/zh/manual/api/reference/item/delete

    相关文章

      网友评论

          本文标题:zabbix主机item过多导致无法删除

          本文链接:https://www.haomeiwen.com/subject/fblpdftx.html