我的编程空间,编程开发者的网络收藏夹
学习永远不晚

运维python进行(三) 用pytho

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

运维python进行(三) 用pytho

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

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

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


介绍

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


[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本身自带此模块增加系统的兼容性

[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完成和获取主机信息的操作

[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会产生变化,所有这里构建了一个方法,只需要传入这三个参数即可

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)


脚本写执行下脚本试试把


[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

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

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


    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()

今天不早了先写到这里明天继续


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

运维python进行(三) 用pytho

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

运维python进行(三) 用pytho

zabbix是一款非常主流监控软件,以简单易用为人称道。zabbix拥有完善的api方便大家通过第三方调用,所以今天介绍一下如何利用python完成对zabbix api调用。   zabbix api主要通过http协议进行通讯,这里我们
2023-01-31

【Python运维】最简单的Pytho

最近在Windows 10上使用Linux子系统,发现它有一个非常坑爹的特点:Linux子系统是没有开机关机状态的,每次进入Bash shell就自动载入,退出后Linux子系统的所有进程都会被关闭,如果你撞了Mysql之类的服务要想随时运
2023-01-31

运维python进行(一) nmap扫描

介绍python-nmap是基于系统nmap命令的一个端口扫描工具,使用简单方便。最近为了加强服务器安全性和监管,需要每天把公司服务器开放端口扫描记录,一旦出现增加减少能发现。之前使用shell写过一个https://github.com/
2023-01-31

Python(三):使用Apache运行

1、现在Apache服务器并安装2、修改Apache安装目录下的配置文件httpd.conf     (1)打开httpd.conf文件,寻找ScriptAlias /cgi-bin/把其后的目录修改为你的.py文件的目录(注意必须是把文件
2023-01-31

python怎么用三元运算符进行条件赋值

小编给大家分享一下python怎么用三元运算符进行条件赋值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用三元运算符进行条件赋值。三元运算符是 if-else
2023-06-27

Python如何使用三元运算符进行条件赋值

本篇内容介绍了“Python如何使用三元运算符进行条件赋值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!技巧1 就地交换两个数字Python
2023-06-29

如何进行Oracle 运维命令整理

本篇文章为大家展示了如何进行Oracle 运维命令整理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、oracle建库与删库命令(1)oracle11g建库(一般习惯配置gdbname与sid名一
2023-06-28

怎么进行Linux 运维最佳实践

本篇文章为大家展示了怎么进行Linux 运维最佳实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们面对的是一个不断变化的世界,业务需求在变,技术架构在变,开源工具与商业系统异构部署,新工具和技术
2023-06-19

python调用zxing项目进行二维码

摘要:首先创建一个java的maven项目,加入zxing相关包,编写二维码相关代码,调试运行,打包;然后创建一个python项目,安装jpype,编写代码把相关的jar包加载,运行。0. 创建一个maven项目1. 配置pom.xml文件
2023-01-31

如何运用结构化思维进行故障处理

近期收到朋友赠送的一本书—《深入浅出MySQL》。闲暇之余,阅读了部分章节,书中针对故障处理一节,给我印象颇深。书中提炼出的一些方法论,正是我之前在团队中推广的方法。其目的是为了将故障应急操作标准化,进而提升处理效率。推而广之,这其实是一种
2023-06-04

为什么运维用Python?

基于Python本身的优点:简单,易学,速度快,免费、开源,高层语言,可移植性,解释性,可扩展性,可嵌入性,丰富的库,独特的语法。Python已经成为现在编程的必备语言。作为“胶水语言”它能够把其他语言制作的各种模块轻松联结在一起。比起C和
2023-01-31

怎么使用SciPy进行二维和三维空间中的点云插值技术

要使用SciPy进行二维和三维空间中的点云插值,可以使用scipy.interpolate模块中的插值函数。以下是一个简单的示例代码,演示如何使用SciPy进行二维空间中的点云插值:import numpy as npfrom scip
怎么使用SciPy进行二维和三维空间中的点云插值技术
2024-05-24

Python怎么编写运维进程文件目录

这篇文章主要介绍“Python怎么编写运维进程文件目录”,在日常操作中,相信很多人在Python怎么编写运维进程文件目录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么编写运维进程文件目录”的疑
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录