Giới thiệu
Proxmox Virtual Environment (Proxmox VE) là nền tảng ảo hóa mã nguồn mở phổ biến cho phép bạn quản lý máy ảo (VM), container và lưu trữ. Proxmox VE cung cấp API RESTful cho phép bạn tự động hóa các tác vụ quản trị và tích hợp Proxmox VE với các công cụ và hệ thống khác.
Lợi ích sử dụng API của Proxmox
- Tự động hóa: API cho phép bạn tự động hóa các tác vụ quản trị tốn thời gian, chẳng hạn như tạo VM, sao lưu và khôi phục VM và cấu hình mạng.
- Tích hợp: API cho phép bạn tích hợp Proxmox VE với các công cụ và hệ thống khác, chẳng hạn như hệ thống giám sát và hệ thống CI/CD.
- Mở rộng: API cho phép bạn phát triển các công cụ và ứng dụng tùy chỉnh của riêng mình để quản lý Proxmox VE.
Bắt đầu với API của Proxmox
Để bắt đầu sử dụng API của Proxmox, bạn cần thực hiện các bước sau:
- Cài đặt Proxmox VE: Tải xuống và cài đặt Proxmox VE trên máy chủ của bạn.
- Kích hoạt API: Mở giao diện web Proxmox VE và điều hướng đến Datacenter > Settings > API. Kích hoạt tùy chọn Enable API và đặt mật khẩu API.
- Tài liệu API: Tham khảo tài liệu API Proxmox chính thức để tìm hiểu về các điểm cuối API, phương thức HTTP và định dạng dữ liệu.
Dưới đây là một số API mà Proxmox hỗ trợ:
/access/ticket
: Đăng nhập vào hệ thống và nhận vé và token ngăn chặn CSRF./nodes
: Lấy danh sách các node trong cụm./nodes/{node}
: Lấy thông tin chi tiết về một node cụ thể./nodes/{node}/qemu
: Lấy danh sách các máy ảo trên một node cụ thể./nodes/{node}/qemu/{vmid}
: Lấy thông tin chi tiết về một máy ảo cụ thể./nodes/{node}/qemu/{vmid}/status/start
: Bắt đầu một máy ảo./nodes/{node}/qemu/{vmid}/status/stop
: Dừng một máy ảo./nodes/{node}/qemu/{vmid}/status/reset
: Đặt lại một máy ảo./nodes/{node}/qemu/{vmid}/status/shutdown
: Tắt một máy ảo./nodes/{node}/qemu/{vmid}/status/suspend
: Tạm dừng một máy ảo./nodes/{node}/qemu/{vmid}/status/resume
: Tiếp tục một máy ảo đã bị tạm dừng./nodes/{node}/qemu/{vmid}/config
: Lấy hoặc cập nhật cấu hình của một máy ảo./nodes/{node}/qemu/{vmid}/clone
: Sao chép một máy ảo./nodes/{node}/qemu/{vmid}/snapshot
: Tạo một bản chụp nhanh của một máy ảo./nodes/{node}/qemu/{vmid}/snapshot/{snapname}
: Lấy hoặc xóa một bản chụp nhanh cụ thể của một máy ảo./nodes/{node}/qemu/{vmid}/snapshot/{snapname}/config
: Lấy hoặc cập nhật cấu hình của một bản chụp nhanh cụ thể của một máy ảo./nodes/{node}/qemu/{vmid}/snapshot/{snapname}/rollback
: Quay lại một bản chụp nhanh cụ thể của một máy ảo.
Đây chỉ là một số API mà Proxmox hỗ trợ. Để biết danh sách đầy đủ, bạn có thể tham khảo tài liệu API chính thức của Proxmox.
Ví dụ về sử dụng API của Proxmox.
Dưới đây là một ví dụ về cách bạn có thể thực hiện điều này bằng Python và thư viện requests:
import requests
from requests.auth import HTTPBasicAuth
# Define the Proxmox server details
PROXMOX_HOST = '192.168.100.201'
USERNAME = 'root'
PASSWORD = 'Hoanghđ164'
REALM = 'pam' # or 'pve' or 'your-authentication-realm'
# Create a session
session = requests.Session()
session.verify = False # Disable SSL certificate verification
# Authenticate
auth_url = f'https://{PROXMOX_HOST}:8006/api2/json/access/ticket'
response = session.post(auth_url, data={'username': USERNAME, 'password': PASSWORD, 'realm': REALM})
data = response.json()['data']
session.headers.update({'CSRFPreventionToken': data['CSRFPreventionToken']})
session.cookies.set('PVEAuthCookie', data['ticket'])
# Get the list of nodes
nodes_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes'
response = session.get(nodes_url)
nodes = response.json()['data']
# For each node, get the list of VMs
for node in nodes:
vms_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes/{node["node"]}/qemu'
response = session.get(vms_url)
vms = response.json()['data']
for vm in vms:
print(f'VM ID: {vm["vmid"]}, Name: {vm["name"]}')
Script này đầu tiên xác thực với máy chủ Proxmox, sau đó nó lấy danh sách các node và đối với mỗi node, nó lấy danh sách các VM.
Hãy thay thế ‘your-proxmox-host’, ‘your-username’, ‘your-password’ và ‘pam’ bằng máy chủ Proxmox, tên người dùng, mật khẩu, và vùng xác thực thực tế của bạn.
Lưu ý rằng script này disabled xác minh chứng chỉ SSL (session.verify = False). Điều này thường không được khuyến nghị vì nó có thể làm cho kết nối không an toàn. Bạn chỉ nên làm điều này nếu bạn chắc chắn rằng nó an toàn với bạn. Trong môi trường production, bạn nên sử dụng một chứng chỉ SSL hợp lệ và giữ xác minh chứng chỉ SSL được kích hoạt.
Nếu bạn muốn tắt các cảnh báo InsecureRequestWarning
như dưới đây liên quan đến SSL.
root@pve01:/home# python3 py.py
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1048: InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.100.201'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1048: InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.100.201'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1048: InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.100.201'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
VM ID: 113, Name: ibanhang-192.168.100.125
VM ID: 100103, Name: demo-server1-100.103
VM ID: 109, Name: driveNTJC-100d122
VM ID: 100102, Name: proxy-server1-100.102
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1048: InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.100.201'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
VM ID: 103, Name: Opnsense-99.253
VM ID: 108, Name: Chamcong-100d121
Bạn có thể thêm các dòng sau vào đầu script của mình:
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
Điều này sẽ tắt cảnh báo InsecureRequestWarning
từ thư viện urllib3
, thư viện này được sử dụng bởi requests
để thực hiện các yêu cầu HTTP.
Dưới đây là cách script của bạn sẽ trông như thế nào sau khi thêm các dòng này:
import requests
from requests.auth import HTTPBasicAuth
import urllib3
# Disable InsecureRequestWarning
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Define the Proxmox server details
PROXMOX_HOST = '192.168.100.201'
USERNAME = 'root'
PASSWORD = 'Zenhub@2023'
REALM = 'pam' # or 'pve' or 'your-authentication-realm'
# Create a session
session = requests.Session()
session.verify = False # Disable SSL certificate verification
# Authenticate
auth_url = f'https://{PROXMOX_HOST}:8006/api2/json/access/ticket'
response = session.post(auth_url, data={'username': USERNAME, 'password': PASSWORD, 'realm': REALM})
data = response.json()['data']
session.headers.update({'CSRFPreventionToken': data['CSRFPreventionToken']})
session.cookies.set('PVEAuthCookie', data['ticket'])
# Get the list of nodes
nodes_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes'
response = session.get(nodes_url)
nodes = response.json()['data']
# For each node, get the list of VMs
for node in nodes:
vms_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes/{node["node"]}/qemu'
response = session.get(vms_url)
vms = response.json()['data']
for vm in vms:
print(f'VM ID: {vm["vmid"]}, Name: {vm["name"]}')
Và đây là kết quả.
VM ID: 100, Name: NTJ-misa100d120
VM ID: 108, Name: Chamcong-100d121
VM ID: 110, Name: qlsx-100d123
VM ID: 111, Name: ketsat-113.161.233.2
VM ID: 121, Name: FBS-100d113
VM ID: 105, Name: hosocty-100d111
VM ID: 118, Name: VDI02-100d115
VM ID: 119, Name: VDI03-100d116
VM ID: 107, Name: TrueNas-100d110
VM ID: 117, Name: VDI01-100d114
VM ID: 104, Name: template-pfsense
VM ID: 106, Name: k8s-standalone-100.101
VM ID: 102, Name: FTA192.168.100.126
VM ID: 120, Name: remote100d112
VM ID: 103, Name: Opnsense-99.253
VM ID: 115, Name: template-centos7-custom
VM ID: 101, Name: temp-windows2022STD
VM ID: 2004, Name: template-focal-server-cloudimg-amd64
VM ID: 112, Name: template-opnsense
VM ID: 1704, Name: template-centos7-qcow2-server-cloudimg-amd64
VM ID: 2204, Name: template-jammy-server-cloudimg-amd64
VM ID: 114, Name: pbx-client
VM ID: 116, Name: pbx-server-100.99
VM ID: 113, Name: ibanhang-192.168.100.125
VM ID: 109, Name: driveNTJC-100d122
VM ID: 100103, Name: demo-server1-100.103
VM ID: 100102, Name: proxy-server1-100.102
Nếu bạn muốn in dữ liệu phản hồi dưới dạng JSON, bạn có thể sử dụng hàm dumps
của module json
, hàm này chuyển đổi một đối tượng Python thành một chuỗi JSON. Dưới đây là cách bạn có thể thực hiện:
import json
# ...
# Đối với mỗi node, lấy danh sách các VM
for node in nodes:
vms_url = f'https://{PROXMUX_HOST}:8006/api2/json/nodes/{node["node"]}/qemu'
response = session.get(vms_url)
vms = response.json()['data']
# In các VM dưới dạng JSON
print(json.dumps(vms, indent=4))
Tham số indent=4
giúp đầu ra dễ đọc hơn bằng cách thêm thụt lề.
Điều này sẽ in mỗi danh sách VM dưới dạng một mảng JSON riêng biệt. Nếu bạn muốn in tất cả các VM trong một mảng JSON duy nhất, bạn có thể thu thập chúng trong một danh sách và sau đó in danh sách:
import json
# ...
all_vms = []
# Đối với mỗi node, lấy danh sách các VM
for node in nodes:
vms_url = f'https://{PROXMUX_HOST}:8006/api2/json/nodes/{node["node"]}/qemu'
response = session.get(vms_url)
vms = response.json()['data']
all_vms.extend(vms)
# In tất cả các VM dưới dạng JSON
print(json.dumps(all_vms, indent=4))
Đoạn code đầy đủ.
import requests
from requests.auth import HTTPBasicAuth
import urllib3
import json
# Disable InsecureRequestWarning
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Define the Proxmox server details
PROXMOX_HOST = '192.168.100.201'
USERNAME = 'root'
PASSWORD = 'Zenhub@2023'
REALM = 'pam' # or 'pve' or 'your-authentication-realm'
# Create a session
session = requests.Session()
session.verify = False # Disable SSL certificate verification
# Authenticate
auth_url = f'https://{PROXMOX_HOST}:8006/api2/json/access/ticket'
response = session.post(auth_url, data={'username': USERNAME, 'password': PASSWORD, 'realm': REALM})
data = response.json()['data']
session.headers.update({'CSRFPreventionToken': data['CSRFPreventionToken']})
session.cookies.set('PVEAuthCookie', data['ticket'])
# Get the list of nodes
nodes_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes'
response = session.get(nodes_url)
nodes = response.json()['data']
all_vms = []
# For each node, get the list of VMs
for node in nodes:
vms_url = f'https://{PROXMOX_HOST}:8006/api2/json/nodes/{node["node"]}/qemu'
response = session.get(vms_url)
vms = response.json()['data']
all_vms.extend(vms)
# Print all VMs as JSON
print(json.dumps(all_vms, indent=4))
Kết quả.
[
{
"maxdisk": 85899345920,
"diskread": 0,
"netout": 1884665693420,
"disk": 0,
"uptime": 13293625,
"name": "NTJ-misa100d120",
"netin": 150078631081,
"vmid": 100,
"cpu": 0.0811261829427298,
"diskwrite": 0,
"status": "running",
"mem": 5267831618,
"pid": 9217,
"cpus": 16,
"maxmem": 17179869184
},
{
"diskwrite": 0,
"mem": 4522186728,
"status": "running",
"pid": 2122155,
"cpus": 8,
"maxmem": 8589934592,
"diskread": 0,
"netout": 479555713,
"maxdisk": 85899345920,
"disk": 0,
"uptime": 11223167,
"name": "Chamcong-100d121",
"netin": 30698944017,
"vmid": 108,
"cpu": 0.0184145181963321
},
{
"netout": 450637219,
"disk": 0,
"maxmem": 8589934592,
"pid": 1048926,
"status": "running",
"cpus": 8,
"netin": 7214099120,
"name": "ketsat-113.161.233.2",
"mem": 3767164858,
"maxdisk": 85899345920,
"diskwrite": 0,
"uptime": 1766201,
"cpu": 0.0067265676820807,
"diskread": 0,
"vmid": 111
},
{
"name": "FBS-100d113",
"netin": 30973641709,
"mem": 24429043342,
"status": "running",
"cpus": 8,
"maxmem": 34359738368,
"pid": 1142788,
"netout": 809646710,
"disk": 0,
"diskread": 0,
"vmid": 121,
"uptime": 1748263,
"cpu": 0.0225820486469852,
"diskwrite": 0,
"maxdisk": 107374182400
},
{
"cpus": 32,
"status": "running",
"mem": 27652854327,
"netin": 163676175698,
"name": "qlsx-100d123",
"disk": 0,
"netout": 391256681016,
"pid": 3618009,
"maxmem": 32212254720,
"cpu": 0.00132129008040871,
"uptime": 9322007,
"vmid": 110,
"diskread": 0,
"maxdisk": 536870912000,
"diskwrite": 0
}
{
"uptime": 989708,
"diskread": 0,
"status": "running",
"netout": 14769221844,
"cpu": 0.0416888618448387,
"maxdisk": 107374182400,
"mem": 3045225993,
"diskwrite": 0,
"vmid": 100102,
"name": "proxy-server1-100.102",
"cpus": 1,
"disk": 0,
"serial": 1,
"netin": 16195511215,
"pid": 2642622,
"maxmem": 8589934592
}
]
Bảo mật API của Proxmox
Điều quan trọng là phải bảo mật API của Proxmox để tránh truy cập trái phép. Hãy làm theo các biện pháp phòng ngừa sau:
- Sử dụng mật khẩu API mạnh: Đặt mật khẩu API mạnh và giữ bí mật.
- Hạn chế quyền truy cập: Cấp cho người dùng và ứng dụng chỉ những quyền truy cập API cần thiết.
- Theo dõi hoạt động API: Theo dõi hoạt động API để phát hiện các hoạt động đáng ngờ.
Kết luận
API của Proxmox là một công cụ mạnh mẽ cho phép bạn tự động hóa các tác vụ quản trị, tích hợp Proxmox VE với các công cụ và hệ thống khác và phát triển các công cụ và ứng dụng tùy chỉnh của riêng mình. Bằng cách sử dụng API của Proxmox một cách an toàn và hiệu quả, bạn có thể cải thiện hiệu quả hoạt động và khả năng quản lý Proxmox VE của mình.
Tài nguyên bổ sung
- Tài liệu API Proxmox [đã xoá URL không hợp lệ]
- Ví dụ về API Proxmox [đã xoá URL không hợp lệ]
- Bảo mật API Proxmox [đã xoá URL không hợp lệ]
Hy vọng bài viết này hữu ích cho bạn!