场景

我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整个主机群组,也可以指定链接某台主机,也可以指定链接包含某个字符的多个主机。

提供的功能

查询模板id

select_template(self, template_name)

查询主机群组id

select_group(self, group_name)

查询指定主机id

select_host(self, hostname='', groupid=''):
  • 当需要查询所有的主机id时

    online_zabbix.select_host()
  • 当需要查询指定主机名称id时

    online_zabbix.select_host(name)
  • 当需要查询指定主机群组的指定主机名称id时

    online_zabbix.select_host(name,groupid)
    hostslist = online_zabbix.select_host('biz')
    print(hostslist)

主机链接模板

hosts_add_template(self, template_name, hostname, group_name='')
  • 当我们想所有的主机链接某个模板,写法 为
    online_zabbix.hosts_add_template('Linux', '')
  • 当我们想包含 特定的主机名或者特定的主机关键字的主机链接某个模板 写法为:
    online_zabbix.hosts_add_template('Linux', 'biz')
  • 当我们想特定的主机群组 包含 特定的主机名或者特定的主机关键字的主机链接某个模板 写法为:
    online_zabbix.hosts_add_template('Linux', 'biz','test')

示例:

online_zabbix.hosts_add_template('Linux', 'biz',' test')

主机删除模板

用法同上

hosts_delete_template(self, template_name, hostname, group_name='')
online_zabbix.hosts_delete_template('Linux', 'biz', 'test')

查询指定业务的接入心跳服务(特定场景无需关注)

online_zabbix.statistics_service('djx', 'Heart Monitor',)

查询所有业务接入心跳服务(特定场景无需关注)

online_zabbix.statistics_total()

脚本

基于python3 , 需要安装 requests 模块

#!/usr/bin/env   python3
# -*- coding: utf-8 -*-
# @Time : 2020/7/1 15:04
# @Author : dongjiaxiao
# @Email :
# @File : hosts_template.py
# @Desc : import requests
import json class ZabbixApi:
def __init__(self, url,username,password):
self.url = url
self.headers = {
'User-Agent': 'python/3.6',
'Content-Type': 'application/json'
}
self.authdata = {
"jsonrpc": "2.0",
"method": "user.login",
"params":
{"user": username, "password": password},
"id": 1666,
}
self.token = self.get_token() def post_request(self, data):
"""
发起请求和获取响应内容
:param data: body 数据
:return:
"""
result = {'code': 0, 'data': '', 'msg': ''}
postdata = json.dumps(data)
try:
response = requests.post(self.url, headers=self.headers, data=postdata, timeout=30)
if response.status_code == 200:
res = response.json()
if res.get('result') != None: # 当 [] 也表示执行成功
result['code'] = 1
result['data'] = res.get('result')
else:
result['msg'] = res
else:
result['msg'] = response.text + "status_code:" + str(response.status_code)
except Exception as e:
result['msg'] = e
print("error{}".format(e))
return result def get_token(self):
"""
获取Token
:return: token 值
"""
token = None
res = self.post_request(self.authdata)
if res.get('code') and res.get('data'):
token = res.get('data')
else:
print(res.get('msg'))
return token def select_group(self, group_name):
"""
寻找主机群组id
:param groupname: 主机群组名
:return group_ids: 主机群组id 列表
"""
group_ids = []
post_data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": ["hostid"],
"search": {
"name": group_name
}
},
"auth": self.token,
"id": 1666
}
group_data = self.post_request(post_data)
if group_data.get('code') and group_data.get('data'):
for data in group_data.get('data'):
group_ids.append(data.get('groupid'))
return group_ids def select_host(self, hostname='', groupid=''):
"""
通过主机群组id或者主机名 查询主机id
:param hostname: 主机名
:param groupid: 主机群组id
:return: 主机列表
"""
host_info = None
if groupid: # 当不传入主机群组id 进入直接查询指定主机
post_data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["hostid"],
"groupids": groupid,
"search": {
"name": hostname
}
},
"auth": self.token,
"id": 1666
}
else:
post_data = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["hostid"],
"search": {
"name": hostname
}
},
"auth": self.token,
"id": 1666
}
host_data = self.post_request(post_data)
if host_data.get('code') and host_data.get('data'):
host_info = host_data['data']
return host_info def select_template(self, template_name):
"""
通过模板名称获取模板id
:param template_name:
:return: 模板id信息
"""
template_info = None
post_data = {
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": ["templateid"],
"search": {
"name": template_name
}
},
"auth": self.token,
"id": 1666
}
template_data = self.post_request(post_data)
if template_data.get('code') and template_data.get('data'):
template_info = template_data['data']
return template_info def hosts_add_template(self, template_name, hostname, group_name=''):
"""
主机群组的指定主机名 添加模板
:param group_name: 主机群组(支持不输入)
:param template_name: 模板名
:param hostname: 主机名(关键词)
:return:
"""
result = {'code': 0, 'msg': ''}
if group_name:
hostlist = self.select_host(hostname, groupid=self.select_group(group_name))
else:
hostlist = self.select_host(hostname)
templatelist = self.select_template(template_name)
if hostlist and templatelist:
post_data = {
"jsonrpc": "2.0",
"method": "template.massadd",
"params": {
"templates": templatelist,
"hosts": hostlist,
},
"auth": self.token,
"id": 1666
}
add_data = self.post_request(post_data)
if add_data.get('code') and add_data.get('data').get('templateids') == templatelist:
result['code'] = 1
else:
# 打印日志,添加失败
result['msg'] = add_data
else:
result['msg'] = "未找到主机/主机群组"
return result def hosts_delete_template(self, template_name, hostname, group_name=''):
"""
主机删除模板
:param template_name: 模板名称
:param hostname: 主机名(关键词)
:param group_name: 可选,指定主机群组
:return:
"""
result = {'code': 0, 'msg': ''}
hostdata = self.select_host(hostname, groupid=self.select_group(group_name))
hostlist = list(map(lambda x: x['hostid'], hostdata))
templatedata = self.select_template(template_name)
templatelist = list(map(lambda x: x['templateid'], templatedata))
if hostlist and templatelist:
post_data = {
"jsonrpc": "2.0",
"method": "host.massremove",
"params": {
"templateids_clear": templatelist,
"hostids": hostlist,
},
"auth": self.token,
"id": 1666
}
add_data = self.post_request(post_data)
if add_data.get('code') and add_data.get('data').get('hostids') == hostlist:
result['code'] = 1
else:
# 打印日志,添加失败
result['msg'] = add_data
else:
result['msg'] = "未找到主机/主机群组"
return result def select_items(self, group_name, itemname, hostname=''):
"""
查询指定主机和模板的监控项
:param group_name: 主机群组名称
:param itemname: 监控项关键词
:param hostname: 主机名称
:return:
"""
result = {'code': 0, 'data': '', 'msg': ''}
hostdata = self.select_host(hostname, groupid=self.select_group(group_name))
hostlist = list(map(lambda x: x['hostid'], hostdata))
if hostlist :
post_data = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": ["key_"],
"hostids": hostlist,
"search": {
"name": itemname
}
},
"auth": self.token,
"id": 1666
}
item_data = self.post_request(post_data)
if item_data.get('code') and item_data.get('data'):
result['code'] = 1
result['data'] = list(map(lambda x: x['key_'].split('[')[1].split(']')[0], item_data['data']))
else:
# 打印日志,添加失败
result['msg'] = item_data
else:
result['msg'] = "未找到主机/主机群组"
return result def statistics_service(self, group_name, itemname, hostname=''):
"""
统计心跳服务添加的应用和业务线
:param group_name: 主机群组
:param itemname: 对应的监控项
:param hostname: 对应的主机名/主机名关键字。
:return:
"""
res = self.select_items(group_name, itemname, hostname)
if res.get('code'):
app_list = set(res.get('data')) # 列表转元组
service_list = set(map(lambda x: '-'.join(x.replace('tomcat-', '').split('-')[0:-1]), app_list))
project_list = set(map(lambda x: x.split('-')[0], service_list))
print("{} 业务线添加了心跳检测: {} 应用:{}, {} 服务:{}".format(project_list, len(service_list), service_list,len(app_list), app_list))
else:
print(res.get('msg')) def statistics_total(self,projects):
"""
统计所有的心跳服务和应用和业务线
:return:
"""
projects = projects
itemname = 'Heart Monitor'
for project in projects:
self.statistics_service(project, itemname,) online_zabbix = ZabbixApi(url='https://zabbix/api_jsonrpc.php',Admin,zabbix)

Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板的更多相关文章

  1. zabbix 创建主机、主机群组、监控第一台服务器

    前面介绍了zabbix服务器和zabbix agent的安装配置,今天使用zabbix监控第一台服务器. 1. 安装zabbix agent 在被监控的服务器上安装zabbix agent . 参考& ...

  2. 通过zabbix自带api进行主机的批量添加操作

    通过zabbix自带api进行批量添加主机 我们需要监控一台服务器的时候,当客户端装好zabbix-agent端并正确配置以后,需要在zabbix-server的web gui界面进行添加zabbix ...

  3. MySQL的数据类型,MySQL增删改--添加主外键、添加属性、删除主外键、改表名、获取系统当前时间等

    ls /etc/rc.d/init.d/mysql56service mysql56 start ps aux |grep "mysql"|grep "socket=&q ...

  4. 部署zabbix 4.0 + grafana

    不完整,仅供参考 Zabbix+grafana监控部署 基本环境 系统: CentOS Linux release 7.3.1611 Zabbix—server:  Zabbix_agent:   N ...

  5. zabbix通过snmp监控linux主机

    1.安装net-snmp [root@db01 ~]# yum install -y net-snmp 2.修改配置文件 [root@db01 ~]# vim /etc/snmp/snmpd.conf ...

  6. zabbix通过snmp监控windows主机

    1.开启Windows的snmp功能 2.配置snmp服务 设置snmp服务社区名称及允许的主机,设置完成后重启snmp服务 3.在zabbix server上测试 测试需要使用命令snmpwalk, ...

  7. 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口

    一.Zabbix-3.0.3批量添加主机的配置如下: 0)被监控机上要安装zabbix_agent,并配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_serve ...

  8. PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息

    最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等.由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取. 一.通过ZABBIX API获取 ...

  9. Python调用zabbix API批量添加主机 (读取Excel)

    本文转载自:http://blog.mreald.com/178 Zabbix可以通过自发现添加主机,不过有时候不准确,通过API添加会更加准确! 脚本使用的跟zabbix相关的内容.参考的是zabb ...

随机推荐

  1. 个人工作用SQL短句,不定时更新

    表字段操作 --一.修改字段默认值 alter table 表名 drop constraint 约束名字 ------说明:删除表的字段的原有约束 alter table 表名 add constr ...

  2. 【spring】循环依赖 Java Vs Spring

    菜瓜:水稻,这次我特意去看了java的循环依赖 水稻:哟,有什么收获 菜瓜:两种情况,构造器循环依赖,属性循环依赖 构造器循环依赖在逻辑层面无法通过.对象通过构造函数创建时如果需要创建另一个对象,就会 ...

  3. const变量的修改

    int main(){ const char a[]="hello world"; char *aa=(char *)a; printf("\nthe a address ...

  4. 大文件上传、断点续传、秒传、beego、vue

    大文件上传 0.项目源码地址 源码地址 :https://github.com/zhuchangwu/large-file-upload 它是个demo,仅供参考 前端基于 vue-simple-up ...

  5. Java容器:HashMap连环炮

    本文来源于:https://mp.weixin.qq.com/s/oRx-8XXbgage9Hf97WrDQQ, 公众号:安琪拉的博客 前言 HashMap应该算是Java后端工程师面试的必问题,因为 ...

  6. VMware 15安装Ubuntu 16.04并配置环境

    VMware(虚拟机)是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统,它能在Windows系统上虚拟出多个计算机,每个虚拟计算机可以独立运行,可安装各种软件与应用等 ...

  7. 2020_06_18Mysql事务

    1.事务的基本介绍 1.概念:一个包含多个步骤的事务,被事务管理,要么同时成功,要么同时失败. 2.操作: 2.1 开启事务:start transaction; 2.2 回滚:rollback; 2 ...

  8. Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端

    要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...

  9. 如何在 asp.net core 3.x 的 startup.cs 文件中获取注入的服务

    一.前言 从 18 年开始接触 .NET Core 开始,在私底下.工作中也开始慢慢从传统的 mvc 前后端一把梭,开始转向 web api + vue,之前自己有个半成品的 asp.net core ...

  10. 认识Eureka (F版)

    Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态).使用Sprin ...