公司介绍简历模板,关键词优化计划,内容管理系统做网站,关键字优化工具手头的Proxmox VE集群和节点越来越多#xff0c;需要考虑统一管理了#xff0c;先定一个小目标——集中状态监控。以前写过检测ceph并用钉钉报警的bash脚本#xff0c;这次换上洋气的方式#xff0c;用python来通过pve的api获取其状态信息。首先参考proxmox官方的api(实际上… 手头的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 URLPVE节点状态https://ip:port/api2/json/nodesPVE集群状态https://ip:port/api2/json/cluster/statusCEPH集群状态https://ip:port/api2/json/cluster/ceph/status为了安全pve要求每次访问都使用ticket所以我们需要先获取一个ticket把它放入Cookie嵌入header然后才能发起访问。作为野生程序猿我们先不考虑日志(一律用print())也不考虑类(烧脑)更不考虑多线程(多个集群的时候能成倍地降低采集时间)。直接上简单明了的两个函数一个获取ticket一个根据url获取信息。然后调用两个函数获取状态信息。运行函数之前还要准备基本的认证信息最后这个样子#codingutf-8 #!/usr/bin/python3#!/usr/bin/python3# huky0924aliyun.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(encodingUTF8) 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, rootpam, 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状态