场景

我们日常在管理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. (九)maven-compiler-plugin 插件详解

    <plugin> <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 --> <groupId> ...

  2. Vue错误汇总

    1.Vue导入js后没反应{{msg}}仍是{{msg}} 错误原因:js里写错了,或者没new一个Vue html页面: 解决方法:代码加入 new

  3. Linux远程连接mongodb

    当没有客户端工具,eg:robo3T时,如何修改mongodb里的数据呢? 1.连接mongodb服务器mongo 1.1.1.1:1688 2.查看数据库列表show dbs 3.选择使用log库u ...

  4. 2、尚硅谷_SSM高级整合_创建Maven项目.avi

    第一步我们新建立一个web工程 这里首先要勾选上enable的第一个复选框 这里要勾选上add maven support 我们在pom.xml中添加sevlet的依赖 创建java web项目之后, ...

  5. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  6. plsql启动报 Using filter for all users can lead to poor perform

    首先,这个与Oracle配置无关,就是在使用pl/sql左侧树形目录时会看到非常多的和你当前工作无关的表,视图,序列等,导致打开速度慢. ​解决办法:Tools-->Object browser ...

  7. CSS布局之盒子模型[一]

    每个HTML标签都会生成一个盒模型,盒模型是正常流布局非常重要的概念.盒模型由内边距(padding)+长度(width)+高度(height)+边框(border)+外边距(margin)组成. 1 ...

  8. 手写内网穿透服务端客户端(NAT穿透)原理及实现

    Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...

  9. P5774 [JSOI2016]病毒感染

    题目描述 JOSI 的边陲小镇爆发了严重的 Jebola 病毒疫情,大批群众感染生命垂危.计算机科学家 JYY 采用最新的算法紧急研制出了 Jebola 疫苗,并火速前往灾区救治患者. 一共有 NN  ...

  10. Java基础Day07(Map Calender Date 包装类 System类 异常)

    1.Map Map是集合容器,存放的元素有键与值两部分组成,通过键可以找到所对应的值,键和值必须是引用数据类型,键是唯一的,不能重复,没有顺序. HashMap是Map的实现类. Map的添加,删除, ...