Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >运维python进行(三) 用pytho

运维python进行(三) 用pytho

作者头像
py3study
发布于 2020-01-09 15:46:57
发布于 2020-01-09 15:46:57
61800
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

  zabbix是一款非常主流监控软件,以简单易用为人称道。zabbix拥有完善的api方便大家通过第三方调用,所以今天介绍一下如何利用python完成对zabbix api调用。

   zabbix api主要通过http协议进行通讯,这里我们使用数据是json格式数据进行交互。

这里先放一个官方文档的传送门方便大家翻阅

介绍

zabbix api的地址是“/api_jsonrpc.php”这里先用linux系统命令做个演示:如何获取zabbix的登录token,下面返回的结果是一个json对应的result是结果,也就是你想要得到的token

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@salt-node1 zabbix]# curl -XPOST http://192.168.198.116/api_jsonrpc.php  -H 'Content-Type:application/json' -d '{
>     "jsonrpc": "2.0",
>     "method": "user.login",
>     "params": {
>         "user": "admin",
>         "password": "zabbix"
>     },
>     "id": 0
> }'
{"jsonrpc":"2.0","result":"f2e8bbaf7e5290d51914a78a0328f19e","id":0}

看上去只是一个post的http请求那我们就用python来搞一下吧

首先我们选的是urllib2模块,之所以用这个是因为python本身自带此模块增加系统的兼容性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@salt-node1 tmp]# python zabbix.py 
f037e64b7018fe987c3b1d3e1d717ecb
[root@salt-node1 tmp]# cat zabbix.py
#coding:utf-8
import json
import urllib2
import logging
logging.basicConfig(filename='./my_log_test.log',format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',level=logging.INFO)

zbx_url = 'http://192.168.199.224:88/api_jsonrpc.php'
zabbix_user = 'admin'
zabbix_pwd = 'dianjoy.com'

def get_token():
    url = zbx_url
    #这里定义一个header的字典,方便填写全部的http头信息
    header = {"Content-Type": "application/json"}
    # 这里是一个需要发送的json数据
    data = '''{
            "jsonrpc": "2.0",
            "method": "user.login",
            "params": {
                "user": "%s",
                "password": "%s"
            },
            "id": 0
        }''' % (zabbix_user,zabbix_pwd)
    # 创建一个请求的对象
    request = urllib2.Request(url,data)
    #遍历获取http头信息
    for key in header:
        request.add_header(key,header[key])
    #发送请求,最终返回token
    try:
        result = urllib2.urlopen(request)
    except urllib2.URLError as e:
        print "Auth Failed, Please Check Your Name And Password:",e.code
    else:
        response = json.loads(result.read())
        result.close()
        return response['result']
        
print get_zbx_token()

现在你已经获取到zabbix的token了就可以做一些别的事情了,

这里大家可以尝试获取一下主机信息

例子:

这是一个curl完成和获取主机信息的操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@salt-node1 tmp]#  curl -k  -H 'Content-Type: application/json' http://192.168.198.116/api_jsonrpc.php -d '{
>         "jsonrpc": "2.0",
>         "method": "host.get",
>         "params": {
>         "output": "extend",
>         "filter": {
>             "name": [
>                 "Zabbix server"
>             ]
>         }
>         },
>         "auth": "d6e4eb7e6bd884fec2ccffe4205d5960",
>         "id": 1 }'
{"jsonrpc":"2.0","result":[{"hostid":"10084","proxy_hostid":"0","host":"Zabbix server","status":"0","disable_until":"0","error":"","available":"1","errors_from":"0","lastaccess":"0","ipmi_authtype":"-1","ipmi_privilege":"2","ipmi_username":"","ipmi_password":"","ipmi_disable_until":"0","ipmi_available":"0","snmp_disable_until":"0","snmp_available":"0","maintenanceid":"0","maintenance_status":"0","maintenance_type":"0","maintenance_from":"0","ipmi_errors_from":"0","snmp_errors_from":"0","ipmi_error":"","snmp_error":"","jmx_disable_until":"0","jmx_available":"0","jmx_errors_from":"0","jmx_error":"","name":"Zabbix server","flags":"0","templateid":"0","description":"","tls_connect":"1","tls_accept":"1","tls_issuer":"","tls_subject":"","tls_psk_identity":"","tls_psk":""}],"id":1}

现在用python完成上面操作,因为zabbix api请求的json内主要三部分:操作zabbix方法,params,token会产生变化,所有这里构建了一个方法,只需要传入这三个参数即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def zbx_req(zbx_action, zbx_params, zbx_token):
    ''' get host info '''
    header = {"Content-Type": "application/json"}
    
    #zabbix server的url地址
    url = zbx_url
    
    #构建请求的json数据
    data='''{
    "jsonrpc": "2.0",
    "method": "%s",
    "params": %s,
    "auth": "%s",
    "id": 1 }''' % (zbx_action, zbx_params, zbx_token)

    request = urllib2.Request(url, data)
    for key in header:
        request.add_header(key, header[key])
    # 请求zabbix获取返回结果
    try:
        result = urllib2.urlopen(request)
    except urllib2.URLError as e:
        print "request Failed:", e.code
    else:
        #因为各种应用场景结果可能不通做了如下判断
        #如果返回的json里面有error这个key代表请求失败,输出错误信息并返回False
        #如果返回json没有result这个key代表结果也不是预期
        #其它的直接返回json的result key的内容
        response = json.loads(result.read())
        if 'error' in response:
            print response['error']
            return False
        elif not response['result']:
            print response
            return False
        else:
            return response['result']
        result.close()

#方法创建好了,这里把参数传入调用下下就好
zbx_token = get_zbx_token()
zbx_action = 'host.get'
zbx_params = '''{
    "output": "extend",
    "filter": {
    "name": ["Zabbix server"]
    }
    }'''
print zbx_req(zbx_action,zbx_params,zbx_token)

脚本写执行下脚本试试把

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@salt-node1 tmp]# python zabbix.py 
[{u'available': u'1', u'tls_connect': u'1', u'maintenance_type': u'0', u'ipmi_errors_from': u'0', u'ipmi_username': u'', u'snmp_disable_until': u'0', u'ipmi_authtype': u'-1', u'ipmi_disable_until': u'0', u'lastaccess': u'0', u'snmp_error': u'', u'tls_psk': u'', u'ipmi_privilege': u'2', u'jmx_error': u'', u'jmx_available': u'0', u'maintenanceid': u'0', u'snmp_available': u'0', u'tls_psk_identity': u'', u'status': u'0', u'description': u'', u'tls_accept': u'1', u'host': u'Zabbix server', u'disable_until': u'0', u'ipmi_password': u'', u'templateid': u'0', u'tls_issuer': u'', u'ipmi_available': u'0', u'maintenance_status': u'0', u'snmp_errors_from': u'0', u'ipmi_error': u'', u'proxy_hostid': u'0', u'hostid': u'10084', u'name': u'Zabbix server', u'jmx_errors_from': u'0', u'jmx_disable_until': u'0', u'flags': u'0', u'error': u'', u'maintenance_from': u'0', u'tls_subject': u'', u'errors_from': u'0'}]

拓展1

相信大家学到这里还不满足,懒是永无止境的,我根据自己情况继续把用法继续封装,根据自己的需求封装一个创建主机的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Zbx_api(object):
    def zbx_create_host(self,hostname,inter_ip,group_id,temlpate_id):
        self.hostname = hostname
        self.inter_ip = inter_ip
        self.group_id = group_id
        self.temlpate_id = temlpate_id
        '''创建主机
            hostname :主机名
            inter_ip :主机IP
            gourp_id :组id
            template_id : 监控模版id
            zbx_create_host('salt-node1','192.168.198.116','4','10001')
        '''
        zbx_action = 'host.create'
        zbx_params = '''{
            "host": "%s",
            "interfaces": [
                {
                    "type": 1,
                    "main": 1,
                    "useip": 1,
                    "ip": "%s",
                    "dns": "",
                    "port": "10050"
                }
            ],
            "groups": [
                {
                    "groupid": "%s"
                }
            ],
            "templates": [
                {
                    "templateid": "%s"
                }
            ],
            "inventory_mode": 0,
            "inventory": {
                "macaddress_a": "nginxs.net",
                "macaddress_b": "nginxs.net"
            }
        }''' % (hostname,inter_ip,group_id,temlpate_id)
        r=Zbx_base_api(zbx_action,zbx_params)
        return r.zbx_req()

拓展2

例如我经常需要把一个group的主机的eth0网卡和CPU负载创建一个screen那我们得用python完成下面几项操作:

1. 创建一个方法获取一个主机组的指定graph id

2. 创建一个方法只要传入screen name,graph id就可以创建一个screen

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def zbx_create_screen(self,screen_name,screen_high,screen_width):
        '''创建screen
        name : SCREEN的名字
        hsize: screen的行数
        vsize: screen的列数
        screenitems: screen里面的item
            resourcetype : 当前数据源的类型"graph","map","url"更多请看传送门https://www.zabbix.com/documentation/2.4/manual/api/reference/screenitem/object#screen_item
            resourceid: itemid
            rowspan: 占据行数
            colspan:占据列数
            x: 屏幕x坐标轴位置
            y:  屏幕y坐标轴位置
         '''
        self.screen_name = screen_name
        self.screen_high = screen_high
        self.screen_width = screen_width
        zbx_action = 'screen.create'
        zbx_params = '''{
        "name": "%s",
        "hsize": %s,
        "vsize": %s,
        "screenitems": [
            {
                "resourcetype": 0,
                "resourceid": "524",
                "rowspan": 1,
                "colspan": 1,
                "x": 0,
                "y": 2
            }
        ]
    }''' % (self.screen_name,self.screen_high,self.screen_width)
        print   zbx_params
        r=Zbx_base_api(zbx_action,zbx_params)
        return zbx_req()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
007.Linux系统命令行入门
shutdown命令可以安全的关闭或者重启系统,并广播关机或者重启的消息给全部的终端
CoderJed
2020/04/10
1.4K0
007.Linux系统命令行入门
三大文本处理工具grep、sed及awk
  grep能够接受正则表达式,生成各种格式的输出。除此之外,它还有大量有趣的选项。
用户1173509
2022/05/09
7260
三大文本处理工具grep、sed及awk
Linux 学习笔记之超详细基础linux命令 Part 2
---------------------------------接Part 1------------------------------
授客
2019/09/12
5380
Linux下复制文件时显示复制进度
老K博客
2023/12/18
7640
linux中计算行数,字数,字符数的10个wc命令示例
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 # wc [options] filenames 以下是该命令提供的选项和用法。 -c, --bytes 输出目标文件中字节的计数结果 -m, --chars 输出目标文件的中字符的计数结果 -l, --lines 输出目标文件中 行 的计数结果 --files0-from=F 从NUL-terminated指明的名字在文件F中的文件中读取,如
入门笔记
2022/06/02
9860
Linux id命令
id 命令可以显示真实有效的用户 ID(UID) 和组 ID(GID)。UID 是对一个用户的单一身份标识。组 ID(GID)则对应多个UID。 Usage: id [OPTION]... [USERNAME] Print user and group information for the specified USERNAME, or (when USERNAME omitted) for the current user. -a ignore, for compatibil
joshua317
2018/04/16
2.6K0
Linux常用命令04 - ls
ls 命令是任何 Linux 用户都应该知道的基本命令之一。 它用于列出有关文件系统中的文件和目录的信息。 ls 实用程序是安装在所有 Linux 发行版上的 Linux/Linux/Linux GNU核心工具组包的一部分。
叉叉敌
2020/04/21
3.9K0
Linux常用命令
cd命令用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径[1]。
Marigold
2023/08/24
2950
Linux 命令(151)—— pwd 命令
pwd(print working directory)打印当前工作目录的绝对路径。
恋喵大鲤鱼
2022/10/25
1.2K0
文件传输同步工具----rsync
rsync是一种强大的命令行工具,用于在本地或远程计算机之间进行文件同步。它可以将文件从一个位置复制到另一个位置,同时节约带宽和存储空间。
cultureSun
2023/05/18
1.6K0
利用硬链接和truncate降低drop table对线上环境的影响
众所周知drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常。 首先,我们看一下为什么drop容量大的table会影响线上服务 直接执行drop table,mysql会将表定义和表数据全都删除,包括磁盘上的物理文件,也包括buffer pool中的内存数据。 这就分两步,第一步从buffer pool中删除,这会涉及到table_cache的lock,如果持有table_cache的lock,这将导致其他查询都无法执行。这种情况在没有innodb_pe
小小科
2018/05/03
7530
利用硬链接和truncate降低drop table对线上环境的影响
linux常用命令全拼(更好理解)
pwd:print work directory 打印当前目录 显示出当前工作目录的绝对路径
Java帮帮
2019/03/07
1.5K0
linux常用命令全拼(更好理解)
[Linux][4_文件,打包和用户管理]
Linux系统中使用以下命令来查看文件的内容:     cat 由第一行开始显示文件内容     tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!     nl 显示的时候,顺道输出行号!     more 一页一页的显示文件内容     less 与 more 类似,但是比 more 更好的是,他可以往前翻页!     head 只看头几行     tail 只看尾巴几行     wc 统计文件行数
玖柒的小窝
2021/10/23
5720
linux常用命令50个_docmd常用命令详解
13. ps 命令显示运行的进程,还会显示进程的一些信息如pid, cpu和内存使用情况等:
全栈程序员站长
2022/09/20
7440
linux常用命令50个_docmd常用命令详解
linux常用命令汇总_unix命令大全
for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done
全栈程序员站长
2022/11/09
6.2K0
linux常用命令汇总_unix命令大全
UBports安装Arduino记录
安装成功后会有一个新的图标哦! 下载文件格式tar.xz。需要解压。 sudo apt install xz-utils sudo apt install tar 然后解压: xz -d ard
zhangrelay
2021/03/03
8120
Linux常用命令03 - grep
grep 命令代表“全局正则表达式 print” ,它是 Linux 中最强大和最常用的命令之一。
叉叉敌
2020/04/21
2.1K0
5分钟带你了解Linux常用命令全称
从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧!
码农编程进阶笔记
2021/11/12
1.1K0
【Linux】《how linux work》第二章 基本命令和目录层次结构(3)
Every Unix file has a set of permissions that determine whether you can read, write, or run the file. Running ls -l displays the permissions. Here’s an example of such a display:
阿东
2024/04/27
1290
【Linux】《how linux work》第二章 基本命令和目录层次结构(3)
Linux命令(25)——cp命令
cp命令主要用于复制文件或目录,可以将一个或多个源文件或者目录复制到指定的目的文件或目录,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
恋喵大鲤鱼
2018/08/03
6.7K0
相关推荐
007.Linux系统命令行入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验