基于Zabbix WebUI的API实现自动化添加主机实战案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
在之前的笔记里我分享了如何批量添加zabbix agent主机,今天我们就实现如何基于zabbix webUI的API接口实现批量添加主机。有的小伙伴在生成环境中喜欢使用自动发现,我并不推荐大家使用自动发现功能,虽然配置起来挺简单的但的确是很消耗zabbix server服务器的性能,而且批量添加的主机你很难规划添加进来的主机是干嘛的,很不方便管理。
因此我强烈使用zabbix webUI的API实现批量主机的添加,这样你可以清除的知道添加进来的主机,方便运维人员进行管理。接下来我们来一起看如何使用API吧。
一.zabbix api概述
Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。它广泛用于: 创建新的应用程序以使用Zabbix; 将Zabbix与第三方软件集成; 自动执行常规任务。
Zabbix API是基于Web的API,作为Web前端的一部分提供。它使用JSON-RPC 2.0协议,这意味着两件事: 该API包含一组独立的方法; 客户端和API之间的请求和响应使用JSON格式进行编码。 博主推荐阅读: https://www.zabbix.com/documentation/4.0/zh/manual/api https://www.jsonrpc.org/specification https://www.json.org/json-en.html
自行安装zabbix server,并确保服务可以Zabbix WebUI可以正常访问,如下图所示。 博主推荐阅读: https://www.cnblogs.com/yinzhengjie2020/p/12302137.html
二.查看主机信息
1>.官方文档
博主推荐阅读: https://www.zabbix.com/documentation/4.0/zh/manual/api/reference/host
2>.先验证(在访问Zabbix中的任何数据之前,你需要登录并获取身份验证令牌。这可以使用该 user.login
方法完成。让我们假设你想要以标准Zabbix Admin用户身份登录。)
[root@zabbix201.yinzhengjie.org.cn ~]# curl -s X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "yinzhengjie" }, "id": 1 }' http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php | python -m json.tool { "id": 1, "jsonrpc": "2.0", "result": "ccabb74e005547096dc587791e23d952" } [root@zabbix201.yinzhengjie.org.cn ~]#
3>.zabbix webUI端添加主机监控
4>.使用API获取多个主机信息
curl -s X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "filter": { "host": [ "Zabbix server", "dbus03.yinzhengjie.org.cn" ] } }, "auth": "ccabb74e005547096dc587791e23d952", "id": 1 }' http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php | python -m json.tool
5>.查看"dbus03.yinzhengjie.org.cn"的主机名称
6>.获取"dbus03.yinzhengjie.org.cn"的主机信息
curl -s X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "filter": { "host": [ "dbus03.yinzhengjie.org.cn" ] } }, "auth": "ccabb74e005547096dc587791e23d952", "id": 1 }' http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php | python -m json.tool
7>.将获取token的操作封装成shell脚本
[root@zabbix201.yinzhengjie.org.cn ~]# cat token.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-27 #FileName: sysinfo.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** URL="http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php" POST_HEADER="Content-Type:application/json" result=`curl -s -X POST -H ${POST_HEADER} -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "yinzhengjie" }, "id": 1 }' ${URL}` echo $result | python -m json.tool | grep result | awk '{print $2}' [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# sh token.sh "ce118ca31eab3ed8af5b4174019e53fa" [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]#
8>.将获取token封装成python脚本
[root@zabbix201.yinzhengjie.org.cn ~]# cat token.py #!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie #EMAIL:y1053419035@qq.com import requests import json #指定zabbix的URL url = 'http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php' #指定API的json格式协议 post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "yinzhengjie" }, "id": 1 } #封装POST方法的header信息 post_header = {'Content-Type': 'application/json'} #使用requests模块将上面的信息进行序列化封装并发送请求,将结果保存到ret对象中 ret = requests.post(url, data=json.dumps(post_data), headers=post_header) #使用json进行反序列化操作,将ret对象中的数据进行反序列化取出数据。 zabbix_ret = json.loads(ret.text) #如果返回的数据没有"result"就报错,否则就打印返回的结果 if not zabbix_ret.has_key('result'): print 'login error' else: print zabbix_ret.get('result') [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# apt -y install python-pip [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# pip install requests [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# python token.py 7b9fd0aa23ad1e351b47f5605a978348 [root@zabbix201.yinzhengjie.org.cn ~]#
三.查看用户信息
1>.查看官方文档
博主推荐阅读: https://www.zabbix.com/documentation/4.0/zh/manual/api/reference/user
2>.查看zabbix webUI的用户
3>.使用API获取现已有用户信息
curl -s X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "user.get", "params": { "output": "extend" }, "auth": "ccabb74e005547096dc587791e23d952", "id": 1 }' http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php | python -m json.tool
四.查看模板信息
1>.查看官方文档
博主推荐阅读: https://www.zabbix.com/documentation/4.0/manual/api/reference/template
2>.在zabbix webUI查看模板
3>.使用zabbix API获取模板
curl -s X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "template.get", "params": { "output": "extend", "filter": { "host": [ "Template OS Linux" ] } }, "auth": "ccabb74e005547096dc587791e23d952", "id": 1 }' http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php | python -m json.tool
五.基于zabbix webUI的API实现自动化添加主机
1>.查看主机群组的id编号
2>.查看模板的id编号(生产环境建议大家自定义一个模板,然后可以基于这个自定义模板链接多个模板,我们在zabix api指定模板时只需要指定咱们自定义的模板id即可)
3>.修改zabbix agent的主机名
[root@dbus03.yinzhengjie.org.cn ~]# grep ^Hostname /etc/zabbix/zabbix_agentd.conf Hostname=172.200.1.3 [root@dbus03.yinzhengjie.org.cn ~]#
4>.查看zabbix WebUI的主机界面
5>.编写zabbix webUI的API脚本,实现批量添加zabbix webUI的主机管理
[root@zabbix201.yinzhengjie.org.cn ~]# python token.py #生成token,下面的脚本要和咱们生成的token信息一致哟~ f694fd866141e2ce7fd6e0db9e617c1e [root@zabbix201.yinzhengjie.org.cn ~]# [root@zabbix201.yinzhengjie.org.cn ~]# cat zabbix_add_host.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-27 #FileName: sysinfo.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** #填写主机的IP地址,如果有多台主机可以添加多个,如果主机较多,可以写在配置文件进行读取 IP=" 172.200.1.1 172.200.1.2 172.200.1.3 " #指定zabbix server的API地址 URL="http://zabbix201.yinzhengjie.org.cn/zabbix/api_jsonrpc.php" #指定POST方法的头部信息,主要声明提交的是JSON格式的数据 POST_HEADER="Content-Type:application/json" #接下里就是批量添加主机的操作了 for node_ip in ${IP};do curl -s -X POST -H ${POST_HEADER} -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "'${node_ip}'", "name": "DBus_'${node_ip}'", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "'${node_ip}'", "dns": "", "port": "10050" } ], "groups": [ { "groupid": "15" } ], "templates": [ { "templateid": "10001" } ] }, "auth": "f694fd866141e2ce7fd6e0db9e617c1e", "id": 1 }' ${URL} | python -m json.tool done [root@zabbix201.yinzhengjie.org.cn ~]#
温馨提示:
上述API参数说明可参考官方文档:
https://www.zabbix.com/documentation/4.0/manual/api/reference/host/object
6>.批量添加脚本
[root@zabbix201.yinzhengjie.org.cn ~]# bash zabbix_add_host.sh { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10278" ] } } { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10279" ] } } { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10280" ] } } [root@zabbix201.yinzhengjie.org.cn ~]#
7>.再次查看zabbix WebUI的主机界面
8>.查看使用API自动添加的主机,验证是否能采集到数据