官方api文档:
https://pve.proxmox.com/pve-docs/api-viewer
# -*- coding:utf-8 -*-
'''
@Author: XGL
@File: pvehttp.py
@CreateTime: 2022/1/20 9:43
https://192.168.16.36:8006/api2/extjs/nodes/pve/lxc/103/status/stop
'''
import requests
from requests.cookies import cookiejar_from_dict
from time import sleep
import urllib3
urllib3.disable_warnings()
class Pvehttp():
def __init__(self, host, username, password):
self.host = host
self.username = username
self.password = password
self.base_url = 'https://' + host + ':8006/'
self.header = {'content-type': 'application/json'}
self.request_data = {
'username': self.username,
'password': self.password,
'realm': 'pam'
}
self.csrftoken = self.baseauth().get('data').get('CSRFPreventionToken')
self.ticket = self.baseauth().get('data').get('ticket')
self.cookies = cookiejar_from_dict({"PVEAuthCookie": self.ticket})
self.post_header = {
'Cookie': 'PVEAuthCookie={}'.format(self.ticket),
'CSRFPreventionToken': self.csrftoken,
}
def baseauth(self):
url = self.base_url + 'api2/json/access/ticket'
response = requests.post(url, headers=self.header, json=self.request_data, verify=False).json()
return response
def req(self, method, apiurl, **kwargs):
url = self.base_url + apiurl
try:
if method == 'get':
response = requests.get(url, **kwargs)
return response.json()
elif method == 'post':
response = requests.post(url, **kwargs)
return response.json()
except Exception as f:
return f
# 状态
def getstatus(self, apiurl):
# url = self.base_url + apiurl
# response = requests.get(url, cookies=self.cookies, verify=False)
return self.req('get', apiurl, cookies=self.cookies, verify=False)
# 开关机等
def poststatus(self, apiurl):
# url = self.base_url + apiurl
return self.req('post', apiurl, headers=self.post_header, verify=False)
# 克隆,增加磁盘,密码等参数
def config(self, apiurl, **data):
return self.req('post', apiurl, headers=self.post_header, json=data, verify=False)
if __name__ == '__main__':
data = {
'username': 'root',
'password': 'password',
'host': '192.168.16.36'
}
pve = Pvehttp(**data)
# print(pve.getstatus('api2/json/cluster/tasks'))
# print(pve.poststatus('api2/extjs/nodes/pve/qemu/101/status/stop'))
# sleep(5)
# print(pve.getstatus('api2/json/nodes/pve/qemu/101/status/current'))
'''
clone
https://192.168.16.36:8006/api2/extjs/nodes/pve/qemu/100/clone#模板id
fullclone
newid: 101
name: test
target: pve
full: 1#完整克隆
分离磁盘delete: scsi1 #https://192.168.16.36:8006/api2/extjs/nodes/pve/qemu/100/config
删除磁盘delete: unused0 #https://192.168.16.36:8006/api2/extjs/nodes/pve/qemu/100/config
对克隆后的机器加硬盘操作,改密码,配置ip等操作
//local-lvm:2 --> 存储:大小
data={
'scsi3': 'local-lvm:2',
'background_delay': 5,
'cipassword': '123456'
}
print(pve.config('api2/extjs/nodes/pve/qemu/102/config', **data))
克隆操作
data={
'newid': 102,
'name': 'test',
'target': 'pve',
'full': 1,
}
print(pve.config('api2/extjs/nodes/pve/qemu/100/clone', **data))
'''
data = {
'scsi1': 'local-lvm:2',
'background_delay': 5,
'cipassword': 'root',
'ipconfig0': 'ip=192.168.16.51/24,gw=192.168.16.1'
}
'https://192.168.16.36:8006/api2/extjs/nodes/pve/qemu/102/config'
print(pve.config('api2/extjs/nodes/pve/qemu/102/config', **data))
虚拟机开机测试