feat(lxc): create_lxc принимает пароль извне (задаётся пользователем)
This commit is contained in:
@@ -26,7 +26,7 @@ def _client() -> ProxmoxAPI:
|
|||||||
|
|
||||||
|
|
||||||
def gen_password(length: int = 14) -> str:
|
def gen_password(length: int = 14) -> str:
|
||||||
"""Генерирует пароль из букв и цифр."""
|
"""Генерирует пароль из букв и цифр (для VM-cloud-init, если пользователь не задал)."""
|
||||||
alphabet = string.ascii_letters + string.digits
|
alphabet = string.ascii_letters + string.digits
|
||||||
return "".join(random.choice(alphabet) for _ in range(length))
|
return "".join(random.choice(alphabet) for _ in range(length))
|
||||||
|
|
||||||
@@ -57,6 +57,7 @@ def create_lxc(
|
|||||||
new_vmid: int,
|
new_vmid: int,
|
||||||
name: str,
|
name: str,
|
||||||
template_volid: str,
|
template_volid: str,
|
||||||
|
password: str,
|
||||||
cores: int,
|
cores: int,
|
||||||
memory_mb: int,
|
memory_mb: int,
|
||||||
disk_gb: int,
|
disk_gb: int,
|
||||||
@@ -67,16 +68,18 @@ def create_lxc(
|
|||||||
|
|
||||||
Шаги (каждый — отдельный запрос к Proxmox API):
|
Шаги (каждый — отдельный запрос к Proxmox API):
|
||||||
1. Создаёт LXC через ``ostemplate`` (без запуска).
|
1. Создаёт LXC через ``ostemplate`` (без запуска).
|
||||||
2. Задаёт новый root-пароль через ``/passwd``.
|
2. Задаёт root-пароль через ``/passwd``.
|
||||||
3. Создаёт rootfs указанного размера через ``/resize``.
|
3. Создаёт rootfs указанного размера через ``/resize``.
|
||||||
4. Запускает контейнер через ``/status/start``.
|
4. Запускает контейнер через ``/status/start``.
|
||||||
|
|
||||||
|
``password`` приходит из формы (клиент задаёт сам) и сохраняется в БД
|
||||||
|
для одноразового показа в карточке инстанса.
|
||||||
|
|
||||||
LXC создаётся ТОЛЬКО из архивного шаблона (vztmpl на storage).
|
LXC создаётся ТОЛЬКО из архивного шаблона (vztmpl на storage).
|
||||||
Клонирование существующего LXC по VMID не поддерживается.
|
Клонирование существующего LXC по VMID не поддерживается.
|
||||||
"""
|
"""
|
||||||
node = node or settings.pve_node
|
node = node or settings.pve_node
|
||||||
px = _client()
|
px = _client()
|
||||||
password = gen_password()
|
|
||||||
|
|
||||||
# 1. Создаём LXC через ostemplate. start=0 — не запускаем, чтобы успеть
|
# 1. Создаём LXC через ostemplate. start=0 — не запускаем, чтобы успеть
|
||||||
# задать пароль и диск нужного размера до старта.
|
# задать пароль и диск нужного размера до старта.
|
||||||
@@ -94,7 +97,7 @@ def create_lxc(
|
|||||||
)
|
)
|
||||||
_wait_task(px, node, upid)
|
_wait_task(px, node, upid)
|
||||||
|
|
||||||
# 2. Задаём новый root-пароль через отдельный endpoint /passwd.
|
# 2. Задаём пароль через отдельный endpoint /passwd.
|
||||||
# Поле password в POST /lxc на некоторых версиях Proxmox игнорируется,
|
# Поле password в POST /lxc на некоторых версиях Proxmox игнорируется,
|
||||||
# поэтому дублируем через /passwd — это идемпотентная операция.
|
# поэтому дублируем через /passwd — это идемпотентная операция.
|
||||||
px.nodes(node).lxc(new_vmid).passwd.post(password=password)
|
px.nodes(node).lxc(new_vmid).passwd.post(password=password)
|
||||||
|
|||||||
Reference in New Issue
Block a user