zabbix自带api
#!/usr/bin/python #coding:utf-8 import requests import json url = "http://192.168.99.14/zabbix/api_jsonrpc.php" headers = {"Content-Type": "application/json-rpc"} def login_zabbix(): data = { "jsonrpc":"2.0", "method":"user.login", "id":1, "auth":None, "params": { "user": "Admin", "password": "zabbix" } } r = requests.post(url, data = json.dumps(data), headers = headers) _content = json.loads(r.content) return _content['result'] def create_hostgoup(): _auth = login_zabbix() data = { "jsonrpc": "2.0", "method": "hostgroup.create", "params": { "name": "reboot" }, "auth": _auth, "id": 1 } r = requests.post(url, data=json.dumps(data), headers=headers) _content = json.loads(r.content) print _content def get_goupid(): _auth = login_zabbix() data = { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "filter": { "name": [ "reboot" ] } }, "auth": _auth, "id": 1 } r = requests.post(url, data=json.dumps(data), headers=headers) _content = json.loads(r.content) return _content['result'][0]['groupid'] def get_templateid(): _auth = login_zabbix() data = { "jsonrpc": "2.0", "method": "template.get", "params": { "output": "extend", "filter": { "host": [ "Template OS Linux", ] } }, "auth": _auth, "id": 1 } r = requests.post(url, data=json.dumps(data), headers=headers) _content = json.loads(r.content) return _content['result'][0]['templateid'] def create_host(_host_list): _auth = login_zabbix() _groupid = get_goupid() _templdateid = get_templateid() for _host in _host_list: data = { "jsonrpc": "2.0", "method": "host.create", "params": { "host": _host['host'], "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": _host['ip'], "dns": "", "port": "10050" } ], "groups": [ { "groupid": _groupid } ], "templates": [ { "templateid": _templdateid } ], "inventory_mode": 0, "inventory": { "macaddress_a": "01234", "macaddress_b": "56768" } }, "auth": _auth, "id": 1 } r = requests.post(url, data=json.dumps(data), headers=headers) _content = json.loads(r.content) print _content['result']['hostids'] if __name__ == "__main__": _host_list = [ {"ip": "192.168.99.10", "host": "reboot-devops-02"}, {"ip": "192.168.99.11", "host": "reboot-ms-web-01"}, {"ip": "192.168.99.12", "host": "reboot-ms-web-02"}, {"ip": "192.168.99.13", "host": "reboot-ms-web-03"} ] create_host(_host_list)
第三方插件
#!/usr/bin/python # coding:utf-8 from flask import current_app from zabbix_client import ZabbixServerProxy from app.models import Zbhost, Server from app import db class Zabbix(object): def __init__(self): self.url = current_app.config.get('ZABBIX_API_URL') self.username = current_app.config.get('ZABBIX_API_USER') self.password = current_app.config.get('ZABBIX_API_PASS') self._login() def _login(self): self.zb = ZabbixServerProxy(self.url) self.zb.user.login(user=self.username, password=self.password) def __del__(self): self.zb.user.logout() def get_hostgroup(self): return self.zb.hostgroup.get(output=['groupid', 'name']) def _create_host(self, params): try: return self.zb.host.create(**params) except Exception,e: return e.args def create_zb_host(self, hostname, ip, groupid = 2): """ 创建zabbix监控主机 :param hostname: :param ip: :param groupid: :return: """ data = {"host": hostname, "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": ip, "dns": "", "port": "10050" } ], "groups": [ { "groupid": groupid } ] } return self._create_host(data) def get_hosts(self): return self.zb.host.get(output=["hostid", "host"]) def get_interfaces(self, ids): """ 获取host的ip :param ids: :return: """ interface = self.zb.hostinterface.get(hostids = ids, output = ["hostid", "ip"]) ret = {} for _it in interface: ret[_it['hostid']] = _it['ip'] return ret def get_templates(self, ids): return self.zb.template.get(hostids = ids, output = ["templateid", "name"]) # 接触模板绑定 def unlink_template(self, hostid, templateid): templates = [{"templateid" : templateid}] return self.zb.host.update(hostid = hostid, templates_clear = templates) # 新增模板,就是查出原来有的模板,然后拼接最新的模板,一起更新为当前的模板 def replace_template(self, hostid, templateids): templates = [] for id in templateids: templates.append({"templateid":id}) try: ret = self.zb.host.update(hostid=hostid,templates = templates) return ret except Exception as e: return e.args def rsync_zabbix_to_zbhost(): """ 将zabbix里的host信息同步到zbhost里 :return: """ zb = Zabbix() # 1 从zabbix里取出所有的host信息 zabbix_hosts = zb.get_hosts() zabbix_hosts_interface = zb.get_interfaces([z['hostid'] for z in zabbix_hosts]) commit = False for host in zabbix_hosts: h = db.session.query(Zbhost).filter_by(hostid = host['hostid']).all() if h: continue host['ip'] = zabbix_hosts_interface[host['hostid']] db.session.add(Zbhost(**host)) commit = True if commit: db.session.commit() def rsync_server_to_zbhost(): """ 同步cmdb server的数据到缓存表zbhost """ hosts = db.session.query(Zbhost).all() servers = db.session.query(Server).filter(Server.inner_ip.in_([h.ip for h in hosts])).all() server_info = {} for s in servers: server_info[s.inner_ip] = s.id for h in hosts: if not h.cmdb_hostid: db.session.query(Zbhost).filter(Zbhost.id == h.id).update({"cmdb_hostid":server_info[h.ip]}) db.session.commit() """ 取出zabbix中主机和模板信息 """ def get_zabbix_data(hosts): zabbix_data = db.session.query(Zbhost).filter(Zbhost.cmdb_hostid.in_([h['id'] for h in hosts])).all() zb = Zabbix() ret = [] for zb_host in zabbix_data: tmp = {} tmp["hostname"] = zb_host.host tmp["templates"] = zb.get_templates(zb_host.hostid) tmp["hostid"] = zb_host.hostid ret.append(tmp) return ret # 连接模板 def zabbix_link_template(hostids, templateids): ret = [] zb = Zabbix() for hostid in hostids: linked_template_ids = [t['templateid'] for t in zb.get_templates(hostid)] linked_template_ids.extend(templateids) ret.append(zb.replace_template(hostid, linked_template_ids)) return ret
使用zabbix_api批量添加模板的脚本: template_massadd.py #!/usr/bin/python #-*- coding:utf8 -*- import json,sys,argparse from zabbix_api import ZabbixAPI server = "http://10.11.0.212/api_jsonrpc.php" username = "Admin" password = "zabbix" zapi = ZabbixAPI(server=server, path="", log_level=0) zapi.login(username, password) ''' 1. 安装zabbix插件 D:pythonzabbix>pip install zabbix-api 2. 使用 zabbix_getallhosts.py 脚本获取主机名,将需要的主机名筛选出来 使用方法: cmd下: python template_massadd.py --host="chinasoft_cbs_frontend_web01,chinasoft_cbs_frontend_web02,chinasoft_cbs_backend_web1,chinasoft_cbs_backend_web2,chinasoft_cbs_backend_web3,chinasoft_cbs_backend_web4,web01,web02,chinasoft_store_web01,chinasoft_store_web02,chinasoft_apiser_web01,chinasoft_apiser_web02,chinasoft_payment_web01,chinasoft_payment_web02,chinasoft_platform_web01,chinasoft_platform_web02,chinasoft_platform_web03,chinasoft_platform_web04,chinasoft_apicms_backend_web01,chinasoft_apicms_backend_web02,eus-timed-task01,eus-store-pay01,eus-apiserver-web03,eus-apiserver-web04" --"templates"="Template process rsync" ''' # 获取参数 def get_args(): parser = argparse.ArgumentParser() parser.add_argument("-H", "--host", help="host name") parser.add_argument("-t", "--templates", help="template name") # 解析所传入的参数 args = parser.parse_args() if not args.host: args.host = raw_input('host: ') if not args.templates: args.templates = raw_input('templates: ') return args 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] def get_templates_id(templates): templates_id = zapi.template.get( { "output": "templateid", "filter": { "host":templates.split(",") } } ) return templates_id def template_massadd(template_id,host_id): template_add = zapi.template.massadd( { "templates": template_id, "hosts": host_id } ) return "host add template success" # 程序入口 if __name__ == "__main__": args = get_args() print 'args:%s' % args host_id = get_host_id(args.host) print 'host_id = %s' % host_id template_id = get_templates_id(args.templates) print 'template_id: %s' % template_id if len(host_id) == len(args.host.split(',')): if len(template_id) == len(args.templates.split(',')): print template_massadd(template_id,host_id) else: print "template not exist" else: print "host not exist" # 用法: # python template_massadd.py --host="chinasoft_apiser_web01,chinasoft_payment_web01" --"templates"="Template process rsync" # host add template success ########################### 批量获取主机名的脚本 #!/usr/bin/evn python # coding=utf-8 import requests import json ZABIX_ROOT = "http://10.11.0.212" url = ZABIX_ROOT + '/api_jsonrpc.php' # user.login payload = { "jsonrpc" : "2.0", "method" : "user.login", "params": { 'user': 'Admin', 'password':'zabbix', }, "auth" : None, "id" : 0, } headers = {'content-type': 'application/json',} req = requests.post(url, json=payload, headers=headers) auth = req.json() # host.get #主机显示名 'name'], # hosts是zabbix.conf文件中配置的主机名 payload = { "jsonrpc" : "2.0", "method" : "host.get", "params": { 'output': [ 'hostid', 'host'], }, "auth" : auth['result'], "id" : 2, } res2 = requests.post(url, data=json.dumps(payload), headers=headers) res2 = res2.json() # f.write(host['name'] + ' ') for host in res2['result']: with open('host.txt', 'a+') as f: f.write(host['host'] + ' ')
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-11-21 19:23:02 # @Author : mihong (mihong@yixia.com) # @Link : ${link} # @Version : $Id$ from aliyunsdkcore import client from aliyunsdkcms.request.v20170301 import QueryMetricListRequest import sys, json, time, random, redis access_key = '这个你不知道就不知道吧' access_secret = '这个你不知道就不知道吧' region_id = 'cn-beijing' def GetRdsId(): key_name = "instanceId" hosts_list = [] RdsIdList = [] FileName = '/workspace/zabbix/rds_monitor/rds_id.list' with open(FileName, 'r') as File: for DBInstanceId in File.readlines(): data_dict = {key_name:DBInstanceId.strip()} hosts_list.append(data_dict) RdsIdList = [hosts_list[i:i+50] for i in range(0,len(hosts_list),50)] return RdsIdList def SetRdsValue(Metric, RdsIdList): clt = client.AcsClient(access_key, access_secret, region_id) request = QueryMetricListRequest.QueryMetricListRequest() request.set_accept_format('json') request.set_Project('acs_rds_dashboard') request.set_Metric(Metric) timestamp_start = int(time.time()-120) * 1000 request.set_StartTime(timestamp_start) request.set_Dimensions(RdsIdList) request.set_Period('60') request.set_Length('1') result = clt.do_action(request) ResValue = json.loads(result)['Datapoints'] return ResValue def GetRdsValue(KeyName): return r.get(KeyName) if __name__ == '__main__': time.sleep(random.randint(1,5)) r = redis.Redis(host='localhost', port=7000, db=0) if sys.argv[1] == 'getAllValue': Metrics = ['CpuUsage','IOPSUsage','MemoryUsage','DiskUsage','ConnectionUsage','DataDelay'] for Metric in Metrics: for RdsIdList in GetRdsId(): KeyArray = SetRdsValue(Metric, RdsIdList) for i in KeyArray: RdsId = i['instanceId'] KeyName = i['instanceId'] + '_' + Metric RdsKeyValue = r.get(KeyName) try: KeyValue = round(i['Average'], 2) except IndexError: KeyValue = 0 if RdsKeyValue == None: r.set(KeyName, KeyValue, ex=3600) print Metric, RdsId, KeyValue, 'New set ok' continue if KeyValue != 0: r.set(KeyName, KeyValue, ex=3600) print Metric, RdsId, KeyValue, 'Update set ok' else: print Metric, RdsId, KeyValue, 'Value=0 Update set Fail' continue if sys.argv[1] == 'getRdsValue': Metric = sys.argv[2] RdsId = sys.argv[3] KeyName = RdsId + '_' + Metric print GetRdsValue(KeyName)