我们在升级环境时遇到了一个问题,那就是zabbix会自动发送邮件给领导,此时领导心里会嘎嘣一下,为了给领导营造一个良好的环境,减少不必要的告警邮件,减少嘎嘣次数,于是在升级之前,取消zabbix监控的agent,当升级完之后再恢复过去。


一、简介

zabbix提供了API接口,可满足基本使用需求,具体参考:zabbix API

有了API接口,我们就可以做到:

  自动执行常规任务

  将zabbix与第三方软件集成

  创建新的应用程序以使用zabbix

zabbix API 是基于web API的,使用的是JSON-RPC2.0协议,客户端与API之间的请求使用的是JSON格式进行编码。

使用远程http请求调用api,需要向 api_jsonrpc.php 位于前端目录中的文件发送HTTP POST请求,url是http://zabbixserverIP/zabbix/api_jsonrpc.php。

请求的头部信息 必须是以下值之一:

application/json-rpc, application/json 或 application/jsonrequest

json中主要的对象有:

jsonrpc - API使用的JSON-RPC协议的版本; Zabbix API实现的JSON-RPC版本是2.0;
method - 被调用的API方法名;
params - 将被传递给API方法的参数;
id - 请求的任意标识符;
auth -用户认证令牌; 因为我们还没有一个,它的设置null。

  

二、思路整理

  登陆zabbix,获取token

  利用token获取agent的id

  利用已获取的id和token调整agent的连接状态

三、具体实现

 

#!/usr/bin/python
import sys
import json
import requests if( len(sys.argv) < 2 ):    #需强调传入3个以上的参数
print("[Usage] $1 is 0/1(0:open 1:off) ; $2 $3.... is agent name. ")
sys.exit(1) class Error(Exception):    #定义自定义错误
def __init__(self,*args):
self.args = args def login(user,passwd,url,header):  #登陆函数获取token
# return token
data = {
"jsonrpc": "2.0" ,
"method": "user.login" ,    
"params": {
"user": user ,
"password": passwd
} ,
"id": 1 ,
}
r = requests.post ( url=url , headers=header , data=json.dumps ( data ) )
if ( r.status_code == 200 ):
return r.json ()['result']
else:
raise Error("return status code is not eq 200. login failed!") def gethostid(hostname,token,url,header):  #获取id
#get dict { hostid , status}
data = {
"jsonrpc": "2.0" ,
"method": "host.get" ,
"params": {
"output": ['status'] ,
"filter": {
"host": [
hostname
]
}
} ,
"auth": token ,
"id": 1
}
r = requests.post ( url=url , headers=header , data=json.dumps ( data ) )
if( r.status_code == 200 ):
if( r.json()['result'] != [] ):   #判断获取到的信息不为“[]”证明是有数据的
return r.json ()['result'][0]
else:
print(" %s hostname is wrong!!" % hostname)
exit(1)
else:
raise Error("return status code is not eq 200. gethostid failed!") def changestatus(hostid,token,url,header,onoroff):   #修改agent的连接状态
# 0:open ; 1:off
data = {
"jsonrpc": "2.0" ,
"method": "host.update" ,
"params": {
"hostid": hostid ,
"status": onoroff
} ,
"auth": token ,
"id": 1
}
r = requests.post ( url=url , headers=header , data=json.dumps ( data ) )
r.close()
if ( r.status_code == 200 ):
return r.json ()['result']["hostids"]
else:
raise Error("return status code is not eq 200. changestatus failed!") if __name__ == '__main__':
allhostname = [ i for i in sys.argv[2:]]
onoroff = int(sys.argv[1])
#allhostname = ["agent1","agent2"]
#onoroff = 0
msg = {0:"on",1:"off"}  #设定开关,0为开启,1为关闭
url = 'http://zabbixserverip/zabbix/api_jsonrpc.php'    #后缀必须是 zabbix/api_jsonrpc.php
user = 'bill'
passwd = '123456'
header = {"Content-Type": "application/json"} try:
for hostname in allhostname:
token = login ( user , passwd , url , header )
dict = gethostid(hostname,token,url,header)
print(dict)
hostid = dict["hostid"]
status = dict["status"]
print("defore the change,hostname: %s hostid:%s status:%s [ %s ] " % (hostname,hostid,status,msg[onoroff]))
if( onoroff != int(status)):    
res=changestatus(hostid,token,url,header,onoroff)
dict2 = gethostid ( hostname , token , url , header )
hostid2 = dict2["hostid"]
status2 = dict2["status"]
print("after the change status: %s [ %s ]" % (status2,msg[onoroff]) )
if (status != status2 ):
print(" %s [ %s ] successful!" % (hostname,msg[onoroff]))
else:
print(" %s [ %s ] failed!" % (hostname , msg[onoroff]) )
else:
print("current %s is %s ,No change." % (hostname,msg[onoroff])) except Exception as e:
print(e)

  将文件移动到ubuntu上,文件名是zabbixagent_onoff.py,可以跟多个主机名,主机名host name,不是visible name

再将其加入jenkins等持续集成工具中,就可实现开关agent了

 

zabbix自动停用与开启agent的更多相关文章

  1. zabbix自动发现与自动注册、自定义监控

    一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...

  2. Zabbix自动发现与自动注册.

    一, 自动发现与自动注册 自动发现? 当场景中出现要添加很多台主机的时候,一台台添加难免太过于繁琐,zabbix提供自动注册,自动发现,可以实现主机的批量添加, zabbix的发现包括三种类型: # ...

  3. 转 zabbix 自动发现和 zabbix自定义用户key与参数User parameters

    ########31 https://www.cnblogs.com/yjt1993/p/10883345.html 1.概念 在配置Iterms的过程中,有时候需要对类似的Iterms进行添加,这些 ...

  4. 网站集群架构(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken

    前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高 ...

  5. zabbix 自动发现 相关

    zabbix自动发现,是zabbix精髓所在. 生产中,一台服务器上可能会存在多个监控实例,比如:A服务器2个,B服务器4个, C服务器1个.单单靠套模板来完成监控,做法那太糟糕了.比如小明有100台 ...

  6. zabbix自动发现与自动注册及SNMP监控

    自动发现与自动注册 自动发现:zabbix Server主动发现所有客户端,然后将客户端登记自己的小本本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册:zabb ...

  7. Zabbix自动发现之fping

    原文发表于cu:2016-06-21 Zabbix自动发现功能从配置流程上比较简单:Discovery与Action. 在做Zabbix的自动发现验证时,使用"ICMP ping" ...

  8. zabbix自动发现监控mysql

    一. 数据库给只读权限 1.1 grant usage on *.* to 'zabbix'@'127.0.0.1' identified by 'zabbix'; flush privileges; ...

  9. zabbix自动发现主机(转)

    zabbix自动发现主机 2018年06月15日 18:02:52 loyal-Wang 阅读数:817更多 个人分类: zabbix   版权声明:本文为博主原创文章,转载请注明出处. https: ...

随机推荐

  1. 网页禁止右键,禁止F12,禁止选中,禁止复制,禁止缓存等操作

    一.禁止右键 //方法一 document.onmousedown = function () { ) { return false; } } //方法二 document.oncontextmenu ...

  2. 如何开发一个异常检测系统:异常检测 vs 监督学习

    异常检测算法先是将一些正常的样本做为无标签样本来学习模型p(x),即评估参数,然后用学习到的模型在交叉验证集上通过F1值来选择表现最好的ε的值,然后在测试集上进行算法的评估.这儿用到了带有标签的数据, ...

  3. 不用图片做的三角语言框效果,纯样式编写,css三角样式写法

      2010-07-05 19:57:28 博主 回复 用户昵称 在秋日真的有轻柔吧. 上边效果与理想的有误差,代码布不上去,下边是源代码,另行保存后查看真正效果,下图是真正效果,区别在三角处,里面颜 ...

  4. React.js Tutorial: React Component Lifecycle

    Introduction about React component lifecycle. 1 Lifecycle A React component in browser can be any of ...

  5. C程序运行原理

    计算机不能直接识别和执行高级语言写的命令,必须用编译程序(也称编译器)把C源程序翻译成二进制形式的目标程序,然后再将该目标程序与系统的函数库以及其他目标程序连接起来,形成可执行的目标程序 C语言的编译 ...

  6. (尚033)Vue_案例_slot(组件间的通信4:slot)

    1.组件间的通信4:slot(slot:插槽,就是一个占位) slot用于标签反复使用很多次 1.1理解 此方式用于父组件向子组件传递标签数据, 其他为数据通信 外面组件向里面组件传递标签进去,直接拿 ...

  7. pmm 添加proxysql metrics

    pmm 对于proxysql 的管理是基于metrics的进行处理的,使用的是proxysql exporter 对于proxysql exporter的添加,比较简单,我们可以通过独立的额容器运行e ...

  8. Spring Could Stream 基本用法

    Spring Cloud Stream是一个建立在Spring Boot和Spring Integration之上的框架,有助于创建事件驱动或消息驱动的微服务. 通过它可以更方便的访问消息服务,如消费 ...

  9. VTK图像遮罩(vtkImageMask)

    #!/usr/bin/env python import vtk reader = vtk.vtkJPEGReader() reader.SetFileName("Pygoscelis ad ...

  10. 洛谷 P5614题解

    吐槽:数据好像有点水,直接枚举到200可以得80 points. 另:我还是太弱了,比赛的时候只有90 points,#7死卡不过去,最后发现是没有判断 \(z_1\) 和 \(z_2\) 的范围-- ...