场景

我们日常在管理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. Stylus 之 网教通直播间整修

    暗色模式 效果 Mozilla 格式源代码 @-moz-document domain("fj.101.com") { * { transition: all .3s; } #wj ...

  2. java特性 JDK JRE JVM

    1简单性 2可移植性性(跨平台) 3面向对象 4高性能 5分布式 6动态性 7多线程 8安全性JDK:java开发工具 . JRE:JDK:java运行环境 . JVM:JDK:java虚拟机

  3. LR字符串处理函数-lr_save_var

    int lr_save_var ("截取的字符串"+start,len,options,param_name) start:表示从第几位截取  len:表示截取长度  option ...

  4. Elasticsearch去重查询/过滤重复数据(聚合)

    带家好,我是马儿,这次来讲一下最近遇到的一个问题 我司某个环境的es中被导入了重复数据,导致查询的时候会出现一些重复数据,所以要我们几个开发想一些解决方案,我们聊了聊,相出了下面一些方案: 1.从源头 ...

  5. 微信小程序scroll-view

    使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height.以下列举一个示例: scroll-top的优先级要高于scroll-into-view的 ...

  6. CentOS 安装 VMware Tools 详细方法

    点击虚拟机,选择安装vmware Tools工具 弹出上面的界面,右键选择奖上面的vmwaraTools.tar.gz解压到你要解压的目录下面 记得一定要使用root用户,进入到解压的目录 然后执行 ...

  7. centos 6.5 上安装jdk

    1.首先明确自己的电脑上32位还是64位,自己的电脑是32位 2.下载jdk进入到oracle公司的主页 把页面拖到最下面 点击上面这个就可以下载以前比较低的版本 这里选择 32位的源码包的方式,将源 ...

  8. Spring mvc 面试

    Spring工作原理及其作用 1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherSer ...

  9. Python学习笔记——基础语法篇

    一.Python初识(IDE环境及基本语法,Spyder快捷方式) Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,没有编译过程,可移植,可嵌入,可扩展. IDE 1.检查Pyth ...

  10. Netty 源码解析(七): NioEventLoop 工作流程

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第七篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...