Untitled

 avatar
unknown
plain_text
5 months ago
2.9 kB
1
Indexable
 from fastapi import FastAPI, Form
from fastapi.responses import HTMLResponse
from proxmoxer import ProxmoxAPI
from jinja2 import Template

# Создание FastAPI приложения
app = FastAPI()

# Подключение к Proxmox через API
proxmox = ProxmoxAPI('proxmox_ip', user='root@pam', password='your_password', verify_ssl=False)

# HTML шаблон для отображения нод и формы для выбора ноды
html_template = """
<html>
    <head>
        <title>Proxmox Node and VM Management</title>
    </head>
    <body>
        <h1>Select a Node to Create a Virtual Machine</h1>
        <h2>Available Nodes and VMs:</h2>
        <ul>
        {% for node in nodes %}
            <li>{{ node['name'] }}: {{ node['vm_count'] }} VM(s)</li>
        {% endfor %}
        </ul>
        <form action="/create_vm" method="post">
            <label for="node">Choose a node:</label>
            <select name="node" id="node">
            {% for node in nodes %}
                <option value="{{ node['name'] }}">{{ node['name'] }}</option>
            {% endfor %}
            </select>
            <br>
            <label for="vm_name">VM Name:</label>
            <input type="text" id="vm_name" name="vm_name" required>
            <br>
            <button type="submit">Create VM</button>
        </form>
    </body>
</html>
"""

@app.get("/", response_class=HTMLResponse)
async def read_root():
    # Получаем список нод и количество ВМ на каждой ноде
    nodes_info = []
    nodes = proxmox.nodes.get()
    for node in nodes:
        node_name = node['node']
        vms = proxmox.nodes(node_name).qemu.get()
        vm_count = len(vms)
        nodes_info.append({"name": node_name, "vm_count": vm_count})

    # Рендеринг HTML-страницы с информацией о нодах и формой для создания ВМ
    template = Template(html_template)
    return template.render(nodes=nodes_info)

@app.post("/create_vm", response_class=HTMLResponse)
async def create_vm(node: str = Form(...), vm_name: str = Form(...)):
    # Логика создания виртуальной машины
    vm_id = proxmox.cluster.nextid.get()  # Получаем следующий доступный VM ID
    proxmox.nodes(node).qemu.post(
        vmid=vm_id,
        name=vm_name,
        cores=2,
        memory=2048,  # Указываем параметры ВМ
        net0='virtio,bridge=vmbr0',
        ostype='l26'  # Тип ОС, например, для Linux
    )
    
    return f"<html><body><h1>VM '{vm_name}' successfully created on node {node}!</h1></body></html>"

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host='0.0.0.0', port=8000)
Editor is loading...
Leave a Comment