python request post 数组_[pve][python]用python3获取pve状态信息
手頭的Proxmox VE集群和節(jié)點(diǎn)越來越多,需要考慮統(tǒng)一管理了,先定一個(gè)小目標(biāo)——集中狀態(tài)監(jiān)控。
以前寫過檢測(cè)ceph并用釘釘報(bào)警的bash腳本,這次換上洋氣的方式,用python來通過pve的api獲取其狀態(tài)信息。
首先參考proxmox官方的api(實(shí)際上自己弄個(gè)外殼全部調(diào)用了你就可以“自主研發(fā)”一個(gè)云計(jì)算虛擬化平臺(tái),業(yè)內(nèi)普遍現(xiàn)狀,你懂的。)
https://pve.proxmox.com/pve-docs/api-viewer/
先在瀏覽器里面測(cè)試一下:
比如你原來使用https://192.168.1.1:8006管理pve,在瀏覽器上再開一個(gè)新的tab,輸入https://192.168.1.1:8006/api2/json/,就可以看到j(luò)son格式的文檔頁面了,像下面這樣:
今天我們只要監(jiān)控幾個(gè)狀態(tài)信息,就看這三個(gè):
| 名稱 | api URL |
| PVE節(jié)點(diǎn)狀態(tài) | https://ip:port/api2/json/nodes |
| PVE集群狀態(tài) | https://ip:port/api2/json/cluster/status |
| CEPH集群狀態(tài) | https://ip:port/api2/json/cluster/ceph/status |
為了安全,pve要求每次訪問都使用ticket,所以我們需要先獲取一個(gè)ticket,把它放入Cookie,嵌入header,然后才能發(fā)起訪問。
作為野生程序猿,我們先不考慮日志(一律用print()),也不考慮類(燒腦),更不考慮多線程(多個(gè)集群的時(shí)候能成倍地降低采集時(shí)間)。
直接上簡(jiǎn)單明了的兩個(gè)函數(shù):一個(gè)獲取ticket,一個(gè)根據(jù)url獲取信息。然后調(diào)用兩個(gè)函數(shù),獲取狀態(tài)信息。
運(yùn)行函數(shù)之前還要準(zhǔn)備基本的認(rèn)證信息,最后這個(gè)樣子:
#coding=utf-8 #!/usr/bin/python3#!/usr/bin/python3#?huky0924@aliyun.com# 參考https://pve.proxmox.com/pve-docs/api-viewer/ #?20200612?檢查PVE運(yùn)行狀態(tài)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 +'認(rèn)證ticket錯(cuò)誤!') print(e) os._exit(1)# 利用ticket從相應(yīng)的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?+?'獲取信息錯(cuò)誤:?'?+?e)if?__name__?==?'__main__': #因?yàn)槭褂米院灻膕sl證書,需要允許 ssl._create_default_https_context = ssl._create_unverified_context????#為了多個(gè)集群信息用數(shù)組表示其認(rèn)證信息,[別名 ip地址?端口?用戶名及其認(rèn)證模式?密碼]。????#實(shí)際操作中使用字典,別名作為鍵,后面的值作為值,為了安全密碼要手動(dòng)輸入并加密????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'])運(yùn)行獲取的信息再提取就可以了,如最后的ceph狀態(tài)
總結(jié)
以上是生活随笔為你收集整理的python request post 数组_[pve][python]用python3获取pve状态信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.26打架被批判一番还是要学习一个
- 下一篇: php json传输被过滤,php-t