Automate Proxmox VE Installation with Answer Files

Learn how to automate Proxmox VE installations using answer files for repeatable, hands-free bare-metal deployments across your homelab or datacenter.

Proxmox Pulse Proxmox Pulse
9 min read
proxmox automation answer-file unattended-install homelab
Automated factory conveyor line stamping identical server units with configuration data.

If you've ever built a Proxmox cluster from scratch, you know the pain: boot the ISO, click through the same wizard, type the same IP, the same hostname, the same password — over and over for every node. Proxmox VE's answer file feature fixes this entirely. Since Proxmox VE 8.1, the installer supports fully unattended, automated installations driven by a simple configuration file. Whether you're provisioning a three-node cluster or reimaging a node after a failure, answer files make the process repeatable, auditable, and hands-free.

What Are Proxmox Answer Files?

An answer file is a TOML-formatted configuration document that the Proxmox installer reads instead of waiting for keyboard input. You supply every value the wizard would normally ask for — disk selection, network config, timezone, root password, and more — and the installer consumes it automatically.

This isn't a late-stage addition or a hack. Proxmox built answer file support directly into the installer infrastructure, which means it works reliably across both BIOS and UEFI systems and supports the full range of installer options.

The answer file approach is ideal for:

  • Homelab rebuilds — Re-provision a node in minutes after a failed drive or OS corruption.
  • Multi-node clusters — Install all nodes consistently without typos or drift.
  • PXE environments — Fully automated network boots for rack servers.
  • Documentation and compliance — Your install configuration is a plain-text file you can version-control in Git.

Understanding the Answer File Format

Answer files use TOML syntax — simple key-value pairs organized into sections. Here's a minimal working example:

[global]
keyboard = "en-us"
country = "us"
fqdn = "pve01.lab.local"
mail = "admin@lab.local"
timezone = "America/New_York"
root_password = "YourStrongPassw0rd!"

[network] source = "from-dhcp"

[disk-setup] filesystem = "zfs" zfs.raid = "raid1" disk_list = ["/dev/sda", "/dev/sdb"]

That's it. Drop this file in the right place, boot the ISO, and Proxmox installs itself without any interaction.

Let's break down each section in detail.

The [global] Section

The [global] block covers locale and identity settings:

[global]
keyboard = "en-us"          # Keyboard layout
country = "us"              # ISO 3166-1 alpha-2 country code
fqdn = "pve01.lab.local"    # Fully qualified hostname — critical for clustering
mail = "admin@lab.local"    # Admin email for notifications
timezone = "America/New_York" # IANA timezone string
root_password = "..."

A few things worth noting:

  • fqdn must be a valid fully qualified domain name. Using bare hostnames like pve01 will cause installer errors.
  • root_password is stored in plaintext in the file. Treat this file like a secret — don't commit it to a public repository, and consider using a secrets manager or environment substitution in CI pipelines.
  • keyboard and country accept standard locale codes. Run localectl list-keymaps on any Linux system to find valid keyboard values.

Configuring Storage with [disk-setup]

This is where answer files really shine — consistent storage configuration is the hardest part of multi-node installs to get right manually.

ext4 or xfs on a Single Disk

[disk-setup]
filesystem = "ext4"
disk_list = ["/dev/sda"]

For single-disk nodes or VMs where you just want a straightforward install, this is all you need.

ZFS RAID-1 Mirror

[disk-setup]
filesystem = "zfs"
zfs.raid = "raid1"
disk_list = ["/dev/sda", "/dev/sdb"]

ZFS RAID-10 (Four Disks)

[disk-setup]
filesystem = "zfs"
zfs.raid = "raid10"
disk_list = ["/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd"]

LVM-thin (Default Proxmox Storage)

[disk-setup]
filesystem = "ext4"
lvm.maxvg = 100           # Percentage of disk for VG
lvm.maxroot = 40          # GB for root partition
lvm.maxswap = 8           # GB for swap
disk_list = ["/dev/sda"]

Available ZFS RAID Levels

zfs.raid value Description
raid0 Striped, no redundancy
raid1 Mirror (2+ disks)
raid10 Striped mirrors (4+ disks)
raidz RAID-Z1 (3+ disks)
raidz2 RAID-Z2 (4+ disks)
raidz3 RAID-Z3 (5+ disks)

Tip: For homelabs on consumer SSDs, ZFS RAID-1 with two drives is the sweet spot — you get redundancy and ZFS data integrity without the write penalty of RAID-Z.

Configuring Networking

The [network] section supports two modes: DHCP-based auto-configuration, or fully explicit static configuration.

DHCP (Quick Start)

[network]
source = "from-dhcp"

The installer pulls an address via DHCP for the initial install. You can configure a static address post-install. This is fine for homelabs where your router assigns consistent DHCP reservations.

Static IP Configuration

[network]
source = "from-answer"
cidr = "192.168.10.101/24"
gateway = "192.168.10.1"
dns = "192.168.10.1"
filter.ID_NET_NAME = "eno1"  # Match by NIC name

The filter key tells the installer which physical interface to configure. You can match by:

  • ID_NET_NAME — Predictable interface name (e.g., eno1, eth0)
  • ID_NET_NAME_MAC — Match by MAC address (most reliable for multi-NIC servers)

Matching by MAC is the most bulletproof approach when you know your hardware:

[network]
source = "from-answer"
cidr = "192.168.10.101/24"
gateway = "192.168.10.1"
dns = "1.1.1.1"
filter.ID_NET_NAME_MAC = "bc:24:11:ab:cd:ef"

Delivering the Answer File

You have two main options for getting the answer file to the installer.

Method 1: USB Drive (Simplest)

This is the easiest approach for homelabs. The installer automatically looks for an answer file on any attached USB drive at /proxmox-ve-answer.toml.

  1. Flash the Proxmox ISO to a USB drive as usual (Rufus, Ventoy, or dd).
  2. Create a second USB drive (any size, FAT32 formatted).
  3. Copy your answer file to the root of the second drive and name it exactly proxmox-ve-answer.toml.
  4. Plug both USBs in when you boot.

The installer detects the answer file automatically and runs non-interactively.

Note with Ventoy: If you're using Ventoy and want everything on one drive, you can place the answer file in the Ventoy partition alongside the ISO. Ventoy's Proxmox plugin supports this — check the Ventoy docs for the exact directory structure.

Method 2: Embed in a Custom ISO

For datacenter or CI/CD use cases, you can build a custom ISO with the answer file baked in. Proxmox provides a tool called proxmox-auto-install-assistant for this:

# Install the tool (on any Proxmox or Debian system with Proxmox repos)
apt install proxmox-auto-install-assistant

Embed your answer file into a copy of the Proxmox ISO

proxmox-auto-install-assistant prepare-iso
--input proxmox-ve_9.0-2.iso
--output proxmox-ve-auto.iso
--answer-file proxmox-ve-answer.toml

The output ISO is a standard bootable image you can PXE-serve or write to USB. Anyone booting it gets the automated install with zero interaction required.

Method 3: PXE Boot with TFTP

For fully network-booted environments, you can serve both the ISO and the answer file over TFTP/HTTP. This is the most scalable approach for multi-node deployments.

The general flow:

  1. Set up a PXE server (dnsmasq + TFTP or iPXE).
  2. Serve the Proxmox installer kernel and initrd.
  3. Pass the answer file URL via kernel command line:

proxmox-ve-answer=http://192.168.10.10/configs/pve01-answer.toml

This lets you maintain per-node answer files on a central server — each node boots, pulls its own config by hostname or IP, and installs itself. Combine this with IPMI/BMC power management and you can reprovision an entire cluster overnight.

Complete Example: Three-Node Cluster Answer Files

Here's a realistic example for provisioning three Proxmox nodes with static IPs and ZFS mirrors. Each node gets its own file:

pve01-answer.toml

[global]
keyboard = "en-us"
country = "us"
fqdn = "pve01.cluster.local"
mail = "ops@example.com"
timezone = "America/Chicago"
root_password = "Cl@uster2026!"

[network] source = "from-answer" cidr = "10.0.10.11/24" gateway = "10.0.10.1" dns = "10.0.10.1" filter.ID_NET_NAME_MAC = "bc:24:11:11:22:33"

[disk-setup] filesystem = "zfs" zfs.raid = "raid1" disk_list = ["/dev/sda", "/dev/sdb"]

pve02-answer.toml and pve03-answer.toml follow the same structure — just change fqdn, cidr, and the MAC address filter.

Post-Install Verification

After the automated install completes, SSH into the node and verify the key settings landed correctly:

# Verify hostname
hostname -f

Check ZFS pool status

zpool status

Confirm network config

ip addr show vmbr0 cat /etc/network/interfaces

Check Proxmox version

pveversion

For ZFS installs, zpool status should show ONLINE with the mirror degraded to healthy:

pool: rpool state: ONLINE config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sda ONLINE 0 0 0 sdb ONLINE 0 0 0

Troubleshooting Common Issues

Installer Ignores the Answer File

Double-check the filename is exactly proxmox-ve-answer.toml (no extra extensions). On Windows, Explorer sometimes hides extensions — the file might actually be named proxmox-ve-answer.toml.txt. Use a terminal to confirm.

Disk Not Found Error

If the installer can't find the disk specified in disk_list, the device path might differ on your hardware. Boot the Proxmox ISO in interactive mode first and check lsblk to confirm the actual disk device names, then update your answer file.

Network Filter Not Matching

If ID_NET_NAME_MAC doesn't match, the install will fall back to DHCP or fail depending on your config. Boot interactively, run ip link to find the correct MAC, and update the filter.

TOML Parse Errors

TOML is whitespace-sensitive. Validate your file before deploying:

# Using the proxmox-auto-install-assistant tool
proxmox-auto-install-assistant validate-answer proxmox-ve-answer.toml

This catches syntax errors before you're standing in front of a rack wondering why the install is failing.

Version-Controlling Your Answer Files

Store your answer files in Git alongside your other infrastructure configs. A few practices that help:

  • Never commit plaintext passwords. Use a placeholder like ${ROOT_PASSWORD} and substitute at deploy time with envsubst or a secrets manager.
  • One file per node for static IP configs, or one parameterized template with a generation script.
  • Tag releases. When you upgrade Proxmox major versions, the answer file format could change — tag the working config with the Proxmox version it was validated against.

A simple secrets substitution pattern:

# answer-template.toml contains ${ROOT_PASSWORD} placeholder
export ROOT_PASSWORD=$(vault kv get -field=password secret/proxmox/root)
envsubst < answer-template.toml > proxmox-ve-answer.toml
# Then deploy proxmox-ve-answer.toml to USB or PXE server

Conclusion

Proxmox answer files transform what used to be a manual, error-prone process into a repeatable, auditable operation. Whether you're rebuilding a homelab node after a disk failure or provisioning a fresh cluster of rack servers, the three-minute install you can trigger and walk away from is dramatically better than babysitting a wizard for every machine.

Start with the USB method — it takes ten minutes to set up and immediately pays off the next time you need to reprovision a node. Once you're comfortable with the format, move to embedded ISOs or PXE delivery for true zero-touch deployments. Combined with a post-install Ansible playbook or shell script, you can have a fully configured, cluster-ready Proxmox node in well under thirty minutes with no manual steps at all.

Share
Proxmox Pulse

Written by

Proxmox Pulse

Sysadmin-driven guides for getting the most out of Proxmox VE in production and homelab environments.

Related Articles

View all →