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 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 连接用的参数可看官方文档 .
两种 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.
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())