场景

我们日常在管理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. 【 哈希和哈希表】Three Friends【进制哈希】

    Three Friends 传送门:链接 (UPC)或  链接(大视野) 题目描述 Three friends like to play the following game. The first f ...

  2. Python爬虫小白入门(七)爬取豆瓣音乐top250

      抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...

  3. Laya 吐槽日志.

    新换了一个公司,公司有两个产品都是用的laya, 一个as写的2D游戏, 一个ts写的3D游戏 as写小游戏,各种不舒服啊,  一堆 __JS这样的代码,   体验极差. laya IDE 按钮只能做 ...

  4. 4.kubernetes的服务发现插件-CoreDNS

    1.1.部署K8S内网资源清单http服务 1.2.部署coredns 部署K8S内网资源清单http服务 在运维主机HDSS7-200.host.com上,配置一个nginx虚拟主机,用以提高k8s ...

  5. Netty中的这些知识点,你需要知道!

    一.Channel Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口. Channel是一个门面,封装了包括网络I/O及相关的 ...

  6. WeChair项目Beta冲刺(5/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第五天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑开发,预约用座 ...

  7. 解决React Native安装应用到真机(红米3S)报Execution failed for task ':app:installDebug'的错误

    报错信息如下: :app:installDebug Installing APK 'app-debug.apk' on 'Redmi 3S - 6.0.1'Unable to install D:\R ...

  8. 深拷贝和浅拷贝以及void里的return用法

    Object o1=new Object(); Object o2; int i1=3,i2; 浅拷贝 o2=o1;i2=i1; 深拷贝 o2=new Object();o2=o1.clone(); ...

  9. jmeter使用小结(一)

    jmeter是用来做接口压力测试的工具.这里只是简单介绍一下使用,大家可以自行查看帮助文档, 1.打开jmeter工具,创建线程组任务 2.添加配置元件,根据需要选择设置 3.添加采样器,这里是htt ...

  10. 主机Redis服务迁移到现有Docker Overlay环境

    记录最后一次对中型2C企业级项目的容器化改造 hello, 好久不见,之前文章记录了一个实战的2C分布式项目的改造过程,结果如下: 其中Redis并未完成容器化改造(目前是主机单点),本文记录将Red ...