PVE-python-接口基本使用

Proxmoxer 官方文档

Proxmoxer Github 仓库

介绍

proxmoxer 是一个开源的 Python 库, 其提供简单接口与 PVE (Proxmox Virtual Environment) API 交互.

其提供了四种连接方法 (backend), 需要安装不同的依赖包:

  • HTTPS, 对应 requests
  • SSH (openSSH), 对应 openssh_wrapper
  • SSH (ssh_paramiko), 对应 paramiko
  • local

安装

1
pip install proxmoxer

可以先安装所有依赖:

1
pip install requests requests_toolbelt openssh_wrapper paramiko

基本使用

连接

需要先创建一个 ProxmoxerAPI instance 来处理 authentication, abstraction 等:

1
2
3
4
5
6
7
8
9
from proxmoxer import ProxmoxAPI

proxmox = ProxmoxAPI(
'<host_ip_or_domain>:<port>',
user='<username>@<realm>',
password='<password>',
backend='https',
verify_ssl=False
)
  • 若不指定 backend, 默认使用 HTTPS

其他 backend 连接用的参数可看官方文档.

两种 API 调用方式

Proxmox 的 API 文档为 https://pve.proxmox.com/pve-docs/api-viewer/index.html.

获取用户信息为 /access/users, 有两种访问方式:

  • Dotted Notation: prox.access.users.get()
  • String Notation: prox("/access/users)

另一个示例, 获取某节点上 Linux 容器信息, api 为 /nodes/{node}/lxc:

  • Dotted Notation: prox.nodes("example-node").lxc.get()
  • String Notation: prox("/nodes/example-node/lxc").get()

两种记法也可以混用.

更新 Authentication

ProxmoxAPI 创建的连接持续两小时后会 expire, 而任意发送一个 request 都能触发 authentication renewal.

Tasks Tools

Proxmox 基于 tasks 的执行方式, 每一个 task 有一个唯一的 UPID (Unique Process ID) 标识:

1
UPID:<node_name>:<pid_in_hex>:<pstart_in_hex>:<starttime_in_hex>:<type>:<id (optional)>:<user>@<realm>:

如:

1
UPID:example-node:000AE992:00A21BA7:618C1D55:vzdump:100:root@pam:

获取 task IDs

1
prox.nodes("example-node").tasks.get(limit=3, source="all")
  • limit 指定要获取的 task IDs 的个数, 默认 50
  • source, 可以指定为 archive (已完成), active (正在执行), all (所有)

具体参数还是看接口文档.

利用 Task ID 获取 task 详情

1
prox.nodes("example-node").tasks("UPID:example-node:000CFC5C:03E8D0C3:6194806C:aptupdate::root@pam:").status.get()

当 task 运行结束时获取信息

1
2
3
4
5
6
def basic_blocking_task_status(proxmox_api, task_id, node_name):
data = {"status": ""}
while (data["status"] != "stopped"):
data = proxmox_api.nodes(node_name).tasks(task_id).status.get()

return data

文件操作

上传文件

若要上传较大文件, 需安装 request_toolbelt 包:

1
2
f = open("<file_path>", "rb")
prox.proxmox.nodes('<node_name>').storage('<storage_name>').upload.post(content='<content_type>', filename=f)
  • <content_type> 指 template 或 iso

下载文件

1
proxmox.nodes("<node_name>").storage("<storage_name>")("download-url").post(url=sourceURL, content="<content_type>", filename="<file_name.extension>")

虚拟机操作

创建虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from proxmoxer import ProxmoxAPI

prox = ProxmoxAPI(
'121.48.165.112:8003',
user='root@pam',
password='starstudio',
backend="https",
verify_ssl=False
)

# 定义虚拟机配置
vm_config = {
'name': 'my-vm2',
'vmid': 102,
'node': 'pve-3',
'storage': 'local-lvm',
'ide0': 'local:iso/Fedora-Server-dvd-x86_64-38-1.6.iso,size=4G',
'agent': 1,
'cores': 2,
'cpu': 'host',
'memory': 2048,
'net0': 'virtio,bridge=vmbr0',
'ostype': 'l26',
'startup': 'order=100'
}

# 创建虚拟机
task_id = prox.nodes('pve-3').qemu.create(**vm_config)
task_status = prox.nodes('pve-3').tasks(task_id).status.get()
print(task_status)

删除虚拟机

1
2
3
task_id = prox.nodes('pve-3').qemu(102).delete()
task_status = prox.nodes('pve-3').tasks(task_id).status.get()
print(task_status)

指定 vmid 即可.

查看虚拟机当前状态

同样用 vmid 指定即可.

1
print(prox.nodes('pve-3').qemu(102).status.current.get())

PVE-python-接口基本使用
http://example.com/2024/08/23/PVE-python-接口基本使用/
作者
Jie
发布于
2024年8月23日
许可协议