Home/DevOps & Cloud/proxmox-full

proxmox-full

Safe
DevOps & Cloud

Complete Proxmox VE management - create/clone/start/stop VMs.

SKILL.md

# Proxmox VE - Full Management Complete control over Proxmox VE hypervisor via REST API. ## Setup ```bash export PVE_URL="https://192.168.1.10:8006" export PVE_TOKEN="user@pam!tokenid=secret-uuid" ``` **Create API token:** Datacenter → Permissions → API Tokens → Add (uncheck Privilege Separation) ## Auth Header ```bash AUTH="Authorization: PVEAPIToken=$PVE_TOKEN" ``` --- ## Cluster & Nodes ```bash # Cluster status curl -sk -H "$AUTH" "$PVE_URL/api2/json/cluster/status" | jq # List nodes curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes" | jq '.data[] | {node, status, cpu: (.cpu*100|round), mem_pct: (.mem/.maxmem*100|round)}' # Node details curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/status" | jq ``` --- ## List VMs & Containers ```bash # All VMs on node curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu" | jq '.data[] | {vmid, name, status}' # All LXC on node curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/lxc" | jq '.data[] | {vmid, name, status}' # Cluster-wide (all VMs + LXC) curl -sk -H "$AUTH" "$PVE_URL/api2/json/cluster/resources?type=vm" | jq '.data[] | {node, type, vmid, name, status}' ``` --- ## VM/Container Control ```bash # Start curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/status/start" # Stop (immediate) curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/status/stop" # Shutdown (graceful) curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/status/shutdown" # Reboot curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/status/reboot" # For LXC: replace /qemu/ with /lxc/ ``` --- ## Create LXC Container ```bash # Get next available VMID NEWID=$(curl -sk -H "$AUTH" "$PVE_URL/api2/json/cluster/nextid" | jq -r '.data') # Create container curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/lxc" \ -d "vmid=$NEWID" \ -d "hostname=my-container" \ -d "ostemplate=local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst" \ -d "storage=local-lvm" \ -d "rootfs=local-lvm:8" \ -d "memory=1024" \ -d "swap=512" \ -d "cores=2" \ -d "net0=name=eth0,bridge=vmbr0,ip=dhcp" \ -d "password=changeme123" \ -d "start=1" ``` **LXC Parameters:** | Param | Example | Description | |-------|---------|-------------| | vmid | 200 | Container ID | | hostname | myct | Container hostname | | ostemplate | local:vztmpl/debian-12-... | Template path | | storage | local-lvm | Storage for rootfs | | rootfs | local-lvm:8 | Root disk (8GB) | | memory | 1024 | RAM in MB | | swap | 512 | Swap in MB | | cores | 2 | CPU cores | | net0 | name=eth0,bridge=vmbr0,ip=dhcp | Network config | | password | secret | Root password | | ssh-public-keys | ssh-rsa ... | SSH keys (URL encoded) | | unprivileged | 1 | Unprivileged container | | start | 1 | Start after creation | --- ## Create VM ```bash # Get next VMID NEWID=$(curl -sk -H "$AUTH" "$PVE_URL/api2/json/cluster/nextid" | jq -r '.data') # Create VM curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu" \ -d "vmid=$NEWID" \ -d "name=my-vm" \ -d "memory=2048" \ -d "cores=2" \ -d "sockets=1" \ -d "cpu=host" \ -d "net0=virtio,bridge=vmbr0" \ -d "scsi0=local-lvm:32" \ -d "scsihw=virtio-scsi-pci" \ -d "ide2=local:iso/ubuntu-22.04.iso,media=cdrom" \ -d "boot=order=scsi0;ide2;net0" \ -d "ostype=l26" ``` **VM Parameters:** | Param | Example | Description | |-------|---------|-------------| | vmid | 100 | VM ID | | name | myvm | VM name | | memory | 2048 | RAM in MB | | cores | 2 | CPU cores per socket | | sockets | 1 | CPU sockets | | cpu | host | CPU type | | net0 | virtio,bridge=vmbr0 | Network | | scsi0 | local-lvm:32 | Disk (32GB) | | ide2 | local:iso/file.iso,media=cdrom | ISO | | ostype | l26 (Linux), win11 | OS type | | boot | order=scsi0;ide2 | Boot order | --- ## Clone VM/Container ```bash # Clone VM curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/clone" \ -d "newid=201" \ -d "name=cloned-vm" \ -d "full=1" \ -d "storage=local-lvm" # Clone LXC curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/lxc/{vmid}/clone" \ -d "newid=202" \ -d "hostname=cloned-ct" \ -d "full=1" \ -d "storage=local-lvm" ``` **Clone Parameters:** | Param | Description | |-------|-------------| | newid | New VMID | | name/hostname | New name | | full | 1=full clone, 0=linked clone | | storage | Target storage | | target | Target node (for migration) | --- ## Convert to Template ```bash # Convert VM to template curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/template" # Convert LXC to template curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/lxc/{vmid}/template" ``` --- ## Snapshots ```bash # List snapshots curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/snapshot" | jq '.data[] | {name, description}' # Create snapshot curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/snapshot" \ -d "snapname=before-update" \ -d "description=Snapshot before system update" # Rollback curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/snapshot/{snapname}/rollback" # Delete snapshot curl -sk -X DELETE -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}/snapshot/{snapname}" ``` --- ## Backups ```bash # Start backup curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/vzdump" \ -d "vmid={vmid}" \ -d "storage=local" \ -d "mode=snapshot" \ -d "compress=zstd" # List backups curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/storage/{storage}/content?content=backup" | jq # Restore backup curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu" \ -d "vmid=300" \ -d "archive=local:backup/vzdump-qemu-100-2024_01_01-12_00_00.vma.zst" \ -d "storage=local-lvm" ``` --- ## Storage & Templates ```bash # List storage curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/storage" | jq '.data[] | {storage, type, avail, used}' # List available templates curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/storage/local/content?content=vztmpl" | jq '.data[] | .volid' # List ISOs curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/storage/local/content?content=iso" | jq '.data[] | .volid' # Download template curl -sk -X POST -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/aplinfo" \ -d "storage=local" \ -d "template=debian-12-standard_12.2-1_amd64.tar.zst" ``` --- ## Tasks ```bash # Recent tasks curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/tasks?limit=10" | jq '.data[] | {upid, type, status}' # Task status curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/tasks/{upid}/status" | jq # Task log curl -sk -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/tasks/{upid}/log" | jq -r '.data[].t' ``` --- ## Delete VM/Container ```bash # Delete VM (must be stopped) curl -sk -X DELETE -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}" # Delete LXC curl -sk -X DELETE -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/lxc/{vmid}" # Force delete (purge) curl -sk -X DELETE -H "$AUTH" "$PVE_URL/api2/json/nodes/{node}/qemu/{vmid}?purge=1&destroy-unreferenced-disks=1" ``` --- ## Quick Reference | Action | Endpoint | Method | |--------|----------|--------| | List nodes | /nodes | GET | | List VMs | /nodes/{node}/qemu | GET | | List LXC | /nodes/{node}/lxc | GET | | Create VM | /nodes/{node}/qemu | POST | | Create LXC | /nodes/{node}/lxc | POST | | Clone | /nodes/{node}/qemu/{vmid}/clone | POST | | Start | /nodes/{node}/qemu/{vmid}/status/start | POST | | Stop | /nodes/{node}/qemu/{vmid}/status/stop | POST | | Snapshot | /nodes/{node}/qemu/{vmid}/snapshot | POST | | Delete | /nodes/{node}/qemu/{vmid} | DELETE | | Next ID | /cluster/nextid | GET | ## Notes - Use `-k` for self-signed certs - API tokens don't need CSRF - Replace `{node}` with node name (e.g., `pve`) - Replace `{vmid}` with VM/container ID - Use `qemu` for VMs, `lxc` for containers - All create/clone operations return task UPID for tracking

More in DevOps & Cloud