Advanced

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.

ProxmoxR app icon

Managing Proxmox? Try ProxmoxR

Monitor and control your VMs & containers from your phone.

Try Free

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.

ProxmoxR

Manage Proxmox from your phone

Monitor, control, and manage your clusters on the go.

Free 7-day trial · No credit card required