手头的Proxmox VE集群和节点越来越多,需要考虑统一管理了,先定一个小目标——集中状态监控。

以前写过检测ceph并用钉钉报警的bash脚本,这次换上洋气的方式,用python来通过pve的api获取其状态信息。

首先参考proxmox官方的api(实际上自己弄个外壳全部调用了你就可以“自主研发”一个云计算虚拟化平台,业内普遍现状,你懂的。)

https://pve.proxmox.com/pve-docs/api-viewer/

先在浏览器里面测试一下:

比如你原来使用https://192.168.1.1:8006管理pve,在浏览器上再开一个新的tab,输入https://192.168.1.1:8006/api2/json/,就可以看到json格式的文档页面了,像下面这样:

今天我们只要监控几个状态信息,就看这三个:

名称 api URL
PVE节点状态 https://ip:port/api2/json/nodes
PVE集群状态 https://ip:port/api2/json/cluster/status
CEPH集群状态 https://ip:port/api2/json/cluster/ceph/status

为了安全,pve要求每次访问都使用ticket,所以我们需要先获取一个ticket,把它放入Cookie,嵌入header,然后才能发起访问。

作为野生程序猿,我们先不考虑日志(一律用print()),也不考虑类(烧脑),更不考虑多线程(多个集群的时候能成倍地降低采集时间)。

直接上简单明了的两个函数:一个获取ticket,一个根据url获取信息。然后调用两个函数,获取状态信息。

运行函数之前还要准备基本的认证信息,最后这个样子:

#coding=utf-8                                                                                                                        #!/usr/bin/python3#!/usr/bin/python3# huky0924@aliyun.com# 参考https://pve.proxmox.com/pve-docs/api-viewer/       # 20200612 检查PVE运行状态import os, sslimport urllib.request, json# 获取pve的ticketdef getTicket(urlBase, user, password):    try:        url = urlBase + 'access/ticket'        params = {'username':  user, 'password':  password}        post = urllib.parse.urlencode(params).encode(encoding='UTF8')        headers = {"Accept": "application/json"}        request = urllib.request.Request(url, post, headers)        response = urllib.request.urlopen(request)        fields = json.loads(response.read().decode('utf-8'))        ticket = fields['data']['ticket']        return ticket    except Exception as e:        print('获取集群'+  alias +'认证ticket错误!')        print(e)        os._exit(1)# 利用ticket从相应的api获取信息def getInfo(urlExt, ticket):    try:        url = urlBase + urlExt        print('')        print('从' + url + '获取信息')        headers = {"Accept": "application/json", "Cookie": "PVEAuthCookie=%s" % ticket}        request = urllib.request.Request(url)        for k,v in headers.items():            request.add_header(k, v)        response = urllib.request.urlopen(request)        fields = json.loads(response.read().decode('utf-8'))        return fields['data']    except Exception as e:        print('从' + url + '获取信息错误: ' + e)if __name__ == '__main__':    #因为使用自签名的ssl证书,需要允许    ssl._create_default_https_context = ssl._create_unverified_context    #为了多个集群信息用数组表示其认证信息,[别名 ip地址 端口 用户名及其认证模式 密码]。    #实际操作中使用字典,别名作为键,后面的值作为值,为了安全密码要手动输入并加密    pveLogin = ['pve集群1', '192.168.2.11', 8006, 'root@pam', 'password']    alias = pveLogin[0]    host = pveLogin[1]    port = pveLogin[2]    user = pveLogin[3]    password = pveLogin[4]        urlBase = 'https://{}:{}/api2/json/'.format(host, port)    pveTicket = getTicket(urlBase, user, password)    statusNodes = getInfo('nodes', pveTicket)    print(statusNodes)    statusCeph = getInfo('cluster/ceph/status', pveTicket)    statusCephs = statusCeph['health']    print(statusCephs['status'])

运行获取的信息再提取就可以了,如最后的ceph状态

python request post 数组_[pve][python]用python3获取pve状态信息相关推荐

  1. python 结构体数组_关于python:将结构化数组转换为常规NumPy数组

    我认为答案将非常明显,但目前看不到. 如何将记录数组转换回常规ndarray? 假设我有以下简单的结构化数组: x = np.array([(1.0, 4.0,), (2.0, -1.0)], dty ...

  2. python request请求参数_使用python将请求的requests headers参数格式化方法

    如下所示: import json # 使用三引号将浏览器复制出来的requests headers参数赋值给一个变量 headers = """ Host: zhan. ...

  3. python语言面试基础_【python面试指北】1.语言基础

    1. python是动态强类型的语言. 动态还是静态指的是编译器还是运行期确定类型 强类型指的是不会发生隐式类型转换.比如js能够执行1+"1",但是python不行,所以pyth ...

  4. python 空数组_【python三级】二维数组的表示

    二维数据:由多个一维数据构成,是一维数据的组合形式. 表格就是典型的二维数据,其中表头是二维数组的一部分. 数组的操作: 二维数组本质上是以数组作为数组元素的数组,类型说明符,数组名,[常量表达式], ...

  5. python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...

    布林指标突破策略,思路非常简单.使用Python语言编写该策略,也非常容易实现,加上回测配置信息,有70行代码,实际可以更加精简,鉴于教学策略,没有使用难懂的Python语法,使用的是比较基础的语句. ...

  6. python给矩阵赋值_解决Python二维数组赋值问题

    解决Python二维数组赋值问题 当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个 ...

  7. python 怎么打印数组_?怎么将python中的数组全部打印出来array

    python array list 1,3似乎不遍历循环是不行滴~ python中的list和array的不同之处 上面正解 python的numpy中合并array 你好: 你用append()是函 ...

  8. python声明数组_在Python中如何声明动态数组

    I want to declare an Array and all items present in the ListBox Should Be deleted irrespective of th ...

  9. python爬取拉勾网_(转)python爬取拉勾网信息

    学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...

最新文章

  1. idea怎么使用jacoco生成报告_Intellij IDEA解析jacoco结果文件的方法
  2. UITableView嵌套WKWebView的那些坑
  3. layer,一个可以让你想到即可做到的javascript弹窗(层)解决方案
  4. 信号与系统第四章-第六章习题易错点整理
  5. 在2019年,如何成为更好的Node.js开发者?
  6. Py之lightgbm:lightgbm的简介、安装、使用方法之详细攻略
  7. 使用WebClient 获得网页内容或提交请求
  8. java xwork_java-与休眠的Struts2 xwork类型转换
  9. atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity
  10. java的内存管理_操作系统实验——java内存管理
  11. 一文梳理水下目标检测方法
  12. 匈牙利命名法为何被淘汰_被称为手表中“蓝血贵族”的百达翡丽,为何会受到如此的追捧?...
  13. TCP 和 UDP 区别及使用场景(详细)
  14. XCode13 纯代码创建IOS APP项目,不使用storyboard
  15. matlab为uigetfile设置默认打开地址(打开路径)
  16. Web地图服务、WMS 请求方式、网络地图服务(WMS)的三大操作
  17. 百度Unit 2.0平台学习理解
  18. 菜鸟海外仓智慧供应链系统“货运参谋”上线,全球跨境仓库100+覆盖30国
  19. VB制作网页自动填表
  20. 新胭脂扣 炼狱_如何逃脱作为新开发人员的炼狱教程-或在您的职业生涯中的任何时候。...

热门文章

  1. HALCON示例程序max_connection.hdev确定分割区域的最大区域数目
  2. HALCON示例程序autobahn高速公路车道识别程序剖析
  3. 【Python生成readme文件】——Markdown语法
  4. 【学习的心得】——“快餐”的效率与“挖掘”的重要性
  5. 关于for循环中的变量int i 如果跳出了这个for循环后,i的值是继续保留还是被释放掉了
  6. python 定时自动爬取_python实现scrapy爬虫每天定时抓取数据的示例代码
  7. python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...
  8. 计算机网络asp视频教程,轻轻松松学编程!ASP互动视频教程
  9. python3装饰器例子_python 装饰器(三):装饰器实例(一)
  10. HTML 文档流和文本流的理解