No menu items!
No menu items!
More

    Sử dụng API của Proxmox

    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!

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email