设为首页 收藏本站
查看: 1452|回复: 0

[经验分享] zabbix利用API批量添加Screen

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-3-24 08:52:28 | 显示全部楼层 |阅读模式
公司服务器太多,如果要一个一个的手动添加Screen的话,那估计我早累死了,所以呢,懒人必备神器,使用Python写了个批量Screen添加和更新的脚本。

说下此脚本的功能和用处吧
1、如果Screen不存在,可以使用此脚本批量添加Screen
2、如果Screen存在,也可以使用此脚本批量更新Screen
3、此脚本会判断主机是否存在,不存在,会直接退出,然后列出可以使用的主机列表

好了,就这么多了,下面贴代码。


#!/usr/bin/python
# coding:utf-8
# 使用说明
# 脚本可以不接受参数,不接受参数则是全部主机更新
# 脚本接受一个或两个参数
# 第一个参数是主机,第二参数是Screen名称
# 省略第二个参数,Screen则与主机名称一样
# ./CUScreen.py
# ./CUScreen.py 主机名称 Screen名称
# ./CUScreen.py Host_Name Screen_Name
# ./CUScreen.py web01
# ./CUScreen.py web01 web01_screen

import urllib2,json,sys

def res(url="", values=""):        
    data = json.dumps(values)
    # 请求API
    res = urllib2.Request(url, data, {"Content-Type": "application/json"})
    resp = urllib2.urlopen(res, data)
    out = json.loads(resp.read())
    try:
        error = out["result"]
    except:
        error = out["error"]["data"]
        return error
    return out["result"]

def auth(url="", username="", password=""):
    values = {
                "jsonrpc": "2.0",
                "method": "user.login",
                "params": {
                        "user": username,
                        "password": password,
                },
                "id": 0,
    }

    id = res(url, values)
    return id

def gethosts(auth=""):
    values = {
                "jsonrpc":"2.0",
                "method":"host.get",
                "params":{
                        "output":{"hostid":"name"},
                },
                "auth":auth,
                "id": 1
             }

    out = res(url, values)
    print "Host Count :",len(out)
    for host in out:
        print "Host ID : %s Host Name : %s" % (host['hostid'],host['name'])
    return out

def getgraphs(auth="", hostname=""):
    values = {
                "jsonrpc":"2.0",
                "method":"graph.get",
                "params":{
                        # 过滤某个主机的Graph
                        "filter":{"host":hostname}
                },
                "auth":auth,
                "id": 1
    }

    out = res(url, values)

    # 判断主机是否存在
    if out == []:
        print hostname,"not is exists"
        print "以下是存在的主机:"
        gethosts(auth)
        sys.exit(1)

    # 定义Screenitem的参数,为空列表
    graphs_list = []
    y = 0
    for i in out:
        graphs_list.append(
             {
                "resourcetype": 0,
                # 添加graphid
                "resourceid": i["graphid"],
                # 定义宽度
                "width":1000,
                # 定义高度
                "height":100,
                # 是否为动态图形
                "dynamic":1,
                # 坐标x轴,向右
                "x": 0,
                # 坐标y轴,向下
                "y": y,
             }
        )
        y += 1
    return graphs_list

# C代表创建 U代表更新
def CUScreen(auth="", screen_name="", graphs_list=""):
    # 判断Screen是否存在
    values1 = {
                "jsonrpc": "2.0",
                "method": "screen.get",
                "params": {
                        "output": "extend",
                        # 过滤Screen
                        "filter":{"name":screen_name},
                },
                "auth": auth,
                "id": 1
    }

    # 定义创建Screen的数据体
    values2 = {
                "jsonrpc": "2.0",
                "method": "screen.create",
                "params": {
                        "name":screen_name,
                        # Screen的宽度
                        "hsize":1,
                        # Screen的长度
                        "vsize":len(graphs_list),
                        # Screen的item信息
                        "screenitems": graphs_list,
                },
                "auth": auth,
                "id": 1
    }

    # 使用values1进行判断
    out = res(url, values1)
    screen_id = out[0]['screenid']
    #进行ScreenID判断
    if out == []:
        # ScreenID不存在则创建ScreenID并添加item
        print screen_name,"Screen Name Not is exists, Create Screen Name :",screen_name
        # 使用values2
        out = res(url, values2)
        print screen_name,"Screen Name is Create OK, Screen Item Create OK"
        return out
    else:
        # 定义更新Screen的数据体
        values3 = {
                    "jsonrpc": "2.0",
                    "method": "screen.update",
                    "params": {
                            # ScreenID
                            "screenid":screen_id,
                            # 计算Screen的行数
                            "vsize":len(graphs_list),
                            # Screen的item
                            "screenitems":graphs_list,
                    },
                    "auth": auth,
                    "id": 1
        }
        # ScreenID存在则更新所有的item
        print screen_name,"Screen Name is exists, Screen ID :",screen_id
        # 使用values3
        out = res(url, values3)
        print screen_name,"Screen Item Update OK"
        return out

if __name__ == "__main__":
    # zabbix的API地址,不同环境的不一样
    url = "http://zabbix.xxx.com/api_jsonrpc.php"
    # zabbix的登陆账号
    username = "xxx"
    # zabbix的登陆密码
    password = "xxx"
    # 默认不输入参数则全部主机都进行更新
    if len(sys.argv) == 1:
        # 获取认证ID
        auth = auth(url,username,password)
        for i in gethosts(auth):
            # 获取GraphID
            graphs_list = getgraphs(auth,i['name'])
            # 使用主机名称(hostname变量)当Screen名称
            CUScreen(auth,i['name'],graphs_list)

    # 如果你输入一个参数,Screen名称与主机名称一样
    if len(sys.argv) == 2:
        # 主机名称,赋值为hostname变量
        hostname = sys.argv[1]
        # 获取认证ID
        auth = auth(url,username,password)
        # 获取GraphID
        graphs_list = getgraphs(auth,hostname)
        # 使用主机名称(hostname变量)当Screen名称
        CUScreen(auth,hostname,graphs_list)

    # 如果你输入二个参数,第一个为主机名称,第二个为Screen名称
    if len(sys.argv) == 3:
        # 主机名称,赋值为hostname变量
        hostname = sys.argv[1]
        # Screen名称,赋值为screen_name变量
        screen_name = sys.argv[2]
        # 获取认证ID
        auth = auth(url,username,password)
        # 获取GraphID
        graphs_list = getgraphs(auth,hostname)
        # 使用screen_name(screen_name变量)来当Screen名称
        CUScreen(auth,screen_name,graphs_list)



此脚本有参考网上的例子。

到此为止了,能力有限,只能做成这样了。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-194959-1-1.html 上篇帖子: zabbix3.0在php7环境下always_populate_raw_post_data的设置 下篇帖子: zabbix解决方案整理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表