Deploy Cloud Images in Proxmox VE: Templates and Mass Deployment
How to download cloud images, import them into Proxmox VE, configure cloud-init, create templates, and deploy multiple VMs quickly.
Why Use Cloud Images?
Cloud images are pre-built, minimal operating system images designed for automated deployment. Instead of running an installer manually for every VM, you download a cloud image once, configure it with cloud-init, and clone it to create new VMs in seconds. Major distributions like Ubuntu, Debian, AlmaLinux, Rocky Linux, and Fedora all publish official cloud images. Combined with Proxmox templates, this is the fastest way to deploy multiple VMs.
Download Cloud Images
SSH into your Proxmox host and download the cloud image for your distribution:
# Ubuntu 24.04 LTS (Noble Numbat):
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
# Debian 12 (Bookworm):
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
# AlmaLinux 9:
wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2
# Rocky Linux 9:
wget https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2
Create a VM and Import the Disk
Create a VM shell, import the cloud image as its disk, and configure the hardware:
# Create a new VM (ID 9000 is a common convention for templates):
qm create 9000 --name ubuntu-cloud --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
# Import the downloaded image to your storage (e.g., local-lvm):
qm importdisk 9000 noble-server-cloudimg-amd64.img local-lvm
# Attach the imported disk as scsi0:
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
# Resize the disk (cloud images are typically 2-3 GB):
qm disk resize 9000 scsi0 32G
# Set boot order:
qm set 9000 --boot order=scsi0
# Add a serial console (required for some cloud images):
qm set 9000 --serial0 socket --vga serial0
Add a Cloud-Init Drive
Cloud-init is the standard for initial VM configuration. Proxmox has native cloud-init support — add a cloud-init drive and configure it through the API or CLI:
# Add cloud-init drive on IDE (standard location):
qm set 9000 --ide2 local-lvm:cloudinit
# Configure cloud-init settings:
qm set 9000 --ciuser admin
qm set 9000 --cipassword $(openssl passwd -6 'YourSecurePassword')
qm set 9000 --sshkeys ~/.ssh/authorized_keys
qm set 9000 --ipconfig0 ip=dhcp
# Or set a static IP:
qm set 9000 --ipconfig0 ip=10.0.0.50/24,gw=10.0.0.1
qm set 9000 --nameserver 10.0.0.1
qm set 9000 --searchdomain homelab.local
You can also configure cloud-init from the Proxmox web UI. Select the VM, go to the Cloud-Init tab, and fill in the fields.
Convert to a Template
Once your cloud image VM is configured, convert it to a template. Templates cannot be started directly but can be cloned instantly:
# Convert VM to template:
qm template 9000
# The VM is now a template and will show a template icon in the web UI
Mass Deployment from Template
Clone the template to create new VMs. Use linked clones for space efficiency or full clones for independence:
# Full clone (independent copy):
qm clone 9000 101 --name web-server-01 --full
qm clone 9000 102 --name web-server-02 --full
qm clone 9000 103 --name db-server-01 --full
# Linked clone (shares base image, uses less storage):
qm clone 9000 101 --name web-server-01
# Customize each clone with different cloud-init settings:
qm set 101 --ipconfig0 ip=10.0.0.51/24,gw=10.0.0.1 --name web-server-01
qm set 102 --ipconfig0 ip=10.0.0.52/24,gw=10.0.0.1 --name web-server-02
qm set 103 --ipconfig0 ip=10.0.0.53/24,gw=10.0.0.1 --name db-server-01
# Start all cloned VMs:
qm start 101
qm start 102
qm start 103
For deploying many VMs at once, script the process:
#!/bin/bash
# deploy-vms.sh - Deploy multiple VMs from template
TEMPLATE=9000
BRIDGE=vmbr0
START_ID=110
COUNT=5
for i in $(seq 1 $COUNT); do
VMID=$((START_ID + i - 1))
IP="10.0.0.$((50 + i))"
qm clone $TEMPLATE $VMID --name "node-${i}" --full
qm set $VMID --ipconfig0 "ip=${IP}/24,gw=10.0.0.1"
qm start $VMID
echo "Deployed VM $VMID (node-${i}) with IP ${IP}"
done
Tips and Best Practices
- Keep templates updated: Periodically create new templates from fresh cloud images to include the latest patches.
- Use naming conventions: Choose a consistent template ID range (e.g., 9000-9099) so templates are easy to identify.
- Install qemu-guest-agent: Before converting to a template, start the VM, install
qemu-guest-agent, and then convert. This ensures all clones have the agent pre-installed.
When deploying a fleet of VMs from cloud image templates, you may want to monitor their startup progress without sitting at your desk. ProxmoxR lets you check which VMs have successfully started and view their IP addresses from your phone, making batch deployments easier to manage on the go.
Summary
Cloud images combined with cloud-init and Proxmox templates provide the fastest path to deploying VMs. Download an official cloud image, import it with qm importdisk, configure cloud-init settings, convert to a template, and clone as many VMs as you need. This workflow eliminates repetitive OS installations and gives you consistent, reproducible VM deployments in seconds.
Take Proxmox management mobile
All the features discussed in this guide — accessible from your phone with ProxmoxR. Real-time monitoring, power control, firewall management, and more.