Untitled
unknown
plain_text
a year ago
2.9 kB
5
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