Packer
Proxmox Builder (from an ISO)
Type: proxmox-iso
The proxmox-iso
Packer builder is able to create new images for use with
Proxmox. The builder takes an ISO
image, runs any provisioning necessary on the image after launching it, then
creates a virtual machine template. This template can then be used as to
create new virtual machines within Proxmox.
The builder does not manage templates. Once it creates a template, it is up to you to use it or delete it.
Configuration Reference
There are many configuration options available for the builder. They are segmented below into two categories: required and optional parameters. Within each category, the available configuration keys are alphabetized.
In addition to the options listed here, a communicator can be configured for this builder.
Required:
proxmox_url
(string) - URL to the Proxmox API, including the full path, sohttps://<server>:<port>/api2/json
for example. Can also be set via thePROXMOX_URL
environment variable.username
(string) - Username when authenticating to Proxmox, including the realm. For exampleuser@pve
to use the local Proxmox realm. Can also be set via thePROXMOX_USERNAME
environment variable.password
(string) - Password for the user. Can also be set via thePROXMOX_PASSWORD
environment variable.node
(string) - Which node in the Proxmox cluster to start the virtual machine on during creation.iso_file
(string) - Path to the ISO file to boot from, expressed as a proxmox datastore path, for examplelocal:iso/Fedora-Server-dvd-x86_64-29-1.2.iso
. Eitheriso_file
ORiso_url
must be specifed.iso_url
(string) - URL to an ISO file to upload to Proxmox, and then boot from. Eitheriso_file
ORiso_url
must be specifed.iso_storage_pool
(string) - Proxmox storage pool onto which to upload the ISO file.iso_checksum
(string) - Checksum of the ISO file. Type of the checksum is infered based on string length, or can be explicitly prefixed with md5:, sha1:, sha256:, sha512: or set to none. Corruption of large files, such as ISOs, can occur during transfer from time to time. As such, setting this to none is not recommended.
Optional:
insecure_skip_tls_verify
(bool) - Skip validating the certificate.pool
(string) - Name of resource pool to create virtual machine in.vm_name
(string) - Name of the virtual machine during creation. If not given, a random uuid will be used.vm_id
(int) - The ID used to reference the virtual machine. This will also be the ID of the final template. If not given, the next free ID on the node will be used.memory
(int) - How much memory, in megabytes, to give the virtual machine. Defaults to512
.cores
(int) - How many CPU cores to give the virtual machine. Defaults to1
.sockets
(int) - How many CPU sockets to give the virtual machine. Defaults to1
cpu_type
(string) - The CPU type to emulate. See the Proxmox API documentation for the complete list of accepted values. For best performance, set this tohost
. Defaults tokvm64
.os
(string) - The operating system. Can bewxp
,w2k
,w2k3
,w2k8
,wvista
,win7
,win8
,win10
,l24
(Linux 2.4),l26
(Linux 2.6+),solaris
orother
. Defaults toother
.vga
(object) - The graphics adapter to use. Example:{ "type": "vmware", "memory": 32 }
network_adapters
(array of objects) - Network adapters attached to the virtual machine. Example:[ { "model": "virtio", "bridge": "vmbr0", "vlan_tag": "10", "firewall": true } ]
bridge
(string) - Required. Which Proxmox bridge to attach the adapter to.model
(string) - Model of the virtual network adapter. Can bertl8139
,ne2k_pci
,e1000
,pcnet
,virtio
,ne2k_isa
,i82551
,i82557b
,i82559er
,vmxnet3
,e1000-82540em
,e1000-82544gc
ore1000-82545em
. Defaults toe1000
.mac_address
(string) - Give the adapter a specific MAC address. If not set, defaults to a random MAC.vlan_tag
(string) - If the adapter should tag packets. Defaults to no tagging.firewall
(bool) - If the interface should be protected by the firewall. Defaults tofalse
.packet_queues
(int) - Number of packet queues to be used on the device. Values greater than 1 indicate that the multiqueue feature is activated. For best performance, set this to the number of cores available to the virtual machine. CPU load on the host and guest systems will increase as the traffic increases, so activate this option only when the VM has to handle a great number of incoming connections, such as when the VM is operating as a router, reverse proxy or a busy HTTP server. Requiresvirtio
network adapter. Defaults to0
.
disks
(array of objects) - Disks attached to the virtual machine. Example:[ { "type": "scsi", "disk_size": "5G", "storage_pool": "local-lvm", "storage_pool_type": "lvm" } ]
storage_pool
(string) - Required. Name of the Proxmox storage pool to store the virtual machine disk on. Alocal-lvm
pool is allocated by the installer, for example.storage_pool_type
(string) - Required. The type of the pool, can belvm
,lvm-thin
,zfspool
,cephfs
,rbd
ordirectory
.type
(string) - The type of disk. Can bescsi
,sata
,virtio
oride
. Defaults toscsi
.disk_size
(string) - The size of the disk, including a unit suffix, such as10G
to indicate 10 gigabytes.cache_mode
(string) - How to cache operations to the disk. Can benone
,writethrough
,writeback
,unsafe
ordirectsync
. Defaults tonone
.format
(string) - The format of the file backing the disk. Can beraw
,cow
,qcow
,qed
,qcow2
,vmdk
orcloop
. Defaults toraw
.io_thread
(bool) - Create one I/O thread per storage controller, rather than a single thread for all I/O. This can increase performance when multiple disks are used. Requiresvirtio-scsi-single
controller and ascsi
orvirtio
disk. Defaults tofalse
.
template_name
(string) - Name of the template. Defaults to the generated name used during creation.template_description
(string) - Description of the template, visible in the Proxmox interface.unmount_iso
(bool) - If true, remove the mounted ISO from the template after finishing. Defaults tofalse
.onboot
(boolean) - Specifies whether a VM will be started during system bootup. Defaults tofalse
.qemu_agent
(boolean) - Disables QEMU Agent option for this VM. When enabled, thenqemu-guest-agent
must be installed on the guest. When disabled, thenssh_host
should be used. Defaults totrue
.disable_kvm
(boolean) - Disables KVM hardware virtualization. Defaults tofalse
.scsi_controller
(string) - The SCSI controller model to emulate. Can belsi
,lsi53c810
,virtio-scsi-pci
,virtio-scsi-single
,megasas
, orpvscsi
. Defaults tolsi
.cloud_init
(bool) - If true, add a Cloud-Init CDROM drive after the virtual machine has been converted to a template.cloud_init_storage_pool
- (string) - Name of the Proxmox storage pool to store the Cloud-Init CDROM on. If not given, the storage pool of the boot device will be used.additional_iso_files
(array of objects) - Additional ISO files attached to the virtual machine. Example:[ { "device": "scsi5", "iso_file": "local:iso/virtio-win-0.1.185.iso", "unmount": true, "iso_checksum": "af2b3cc9fa7905dea5e58d31508d75bba717c2b0d5553962658a47aebc9cc386" } ]
device
(string) - Bus type and bus index that the ISO will be mounted on. Can beideX
,sataX
orscsiX
. Foride
the bus index ranges from 0 to 3, forsata
form 0 to 5 and forscsi
from 0 to 30. Defaults toide3
sinceide2
is generelly the boot drive.iso_file
(string) - Path to the ISO file to boot from, expressed as a proxmox datastore path, for examplelocal:iso/Fedora-Server-dvd-x86_64-29-1.2.iso
. Eitheriso_file
ORiso_url
must be specifed.iso_url
(string) - URL to an ISO file to upload to Proxmox, and then boot from. Eitheriso_file
ORiso_url
must be specifed.iso_storage_pool
(string) - Proxmox storage pool onto which to upload the ISO file.iso_checksum
(string) - Checksum of the ISO file.unmount
(bool) - If true, remove the mounted ISO from the template after finishing. Defaults tofalse
.
http_interface
- (string) - Name of the network interface that Packer getsHTTPIP
from. Defaults to the first non loopback interface.vm_interface
- (string) - Name of the network interface that Packer gets the VMs IP from. Defaults to the first non loopback interface.boot
- (string) - Override default boot order. Format exampleorder=virtio0;ide2;net0
. Prior to Proxmox 6.2-15 the format wascdn
(c:CDROM -> d:Disk -> n:Network)
Boot Command
The boot_command
configuration is very important: it specifies the keys to
type when the virtual machine is first booted in order to start the OS
installer. This command is typed after boot_wait
, which gives the virtual
machine some time to actually load the ISO.
As documented above, the boot_command
is an array of strings. The strings
are all typed in sequence. It is an array only to improve readability within
the template.
The boot command is "typed" character for character over the virtual keyboard to the machine, simulating a human actually typing the keyboard.
There are a set of special keys available. If these are in your boot command, they will be replaced by the proper key:
<bs>
- Backspace<del>
- Delete<enter> <return>
- Simulates an actual "enter" or "return" keypress.<esc>
- Simulates pressing the escape key.<tab>
- Simulates pressing the tab key.<f1> - <f12>
- Simulates pressing a function key.<up> <down> <left> <right>
- Simulates pressing an arrow key.<spacebar>
- Simulates pressing the spacebar.<insert>
- Simulates pressing the insert key.<home> <end>
- Simulates pressing the home and end keys.<pageUp> <pageDown>
- Simulates pressing the page up and page down keys.<menu>
- Simulates pressing the Menu key.<leftAlt> <rightAlt>
- Simulates pressing the alt key.<leftCtrl> <rightCtrl>
- Simulates pressing the ctrl key.<leftShift> <rightShift>
- Simulates pressing the shift key.<leftSuper> <rightSuper>
- Simulates pressing the ⌘ or Windows key.<wait> <wait5> <wait10>
- Adds a 1, 5 or 10 second pause before sending any additional keys. This is useful if you have to generally wait for the UI to update before typing more.<waitXX>
- Add an arbitrary pause before sending any additional keys. The format ofXX
is a sequence of positive decimal numbers, each with optional fraction and a unit suffix, such as300ms
,1.5h
or2h45m
. Valid time units arens
,us
(orµs
),ms
,s
,m
,h
. For example<wait10m>
or<wait1m20s>
On/Off variants
Any printable keyboard character, and of these "special" expressions, with the
exception of the <wait>
types, can also be toggled on or off. For example, to
simulate ctrl+c, use <leftCtrlOn>c<leftCtrlOff>
. Be sure to release them,
otherwise they will be held down until the machine reboots.
To hold the c
key down, you would use <cOn>
. Likewise, <cOff>
to release.
Templates inside boot command
In addition to the special keys, each command to type is treated as a template engine. The available variables are:
HTTPIP
andHTTPPort
- The IP and port, respectively of an HTTP server that is started serving the directory specified by thehttp_directory
configuration parameter. Ifhttp_directory
isn't specified, these will be blank!Name
- The name of the VM.
For more examples of various boot commands, see the sample projects from our community templates page.
The example shown below is a working boot command used to start an Ubuntu 12.04 installer:
[
"<esc><esc><enter><wait>",
"/install/vmlinuz noapic ",
"preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
"debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
"hostname={{ .Name }} ",
"fb=false debconf/frontend=noninteractive ",
"keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA ",
"keyboard-configuration/variant=USA console-setup/ask_detect=false ",
"initrd=/install/initrd.gz -- <enter>"
]
For more examples of various boot commands, see the sample projects from our community templates page.
Http directory configuration
Packer will create an http server serving http_directory
when it is set, a
random free port will be selected and the architecture of the directory
referenced will be available in your builder.
Example usage from a builder:
wget http://{{ .HTTPIP }}:{{ .HTTPPort }}/foo/bar/preseed.cfg
Optional:
http_directory
(string) - Path to a directory to serve using an HTTP server. The files in this directory will be available over HTTP that will be requestable from the virtual machine. This is useful for hosting kickstart files and so on. By default this is an empty string, which means no HTTP server will be started. The address and port of the HTTP server will be available as variables inboot_command
. This is covered in more detail below.http_port_min
(int) - These are the minimum and maximum port to use for the HTTP server started to serve thehttp_directory
. Because Packer often runs in parallel, Packer will choose a randomly available port in this range to run the HTTP server. If you want to force the HTTP server to be on one port, make this minimum and maximum port the same. By default the values are8000
and9000
, respectively.http_port_max
(int) - HTTP Port Maxhttp_bind_address
(string) - This is the bind address for the HTTP server. Defaults to 0.0.0.0 so that it will work with any network interface.
Example: Fedora with kickstart
Here is a basic example creating a Fedora 29 server image with a Kickstart file served with Packer's HTTP server. Note that the iso file needs to be manually downloaded.
{
"variables": {
"username": "apiuser@pve",
"password": "supersecret"
},
"builders": [
{
"type": "proxmox",
"proxmox_url": "https://my-proxmox.my-domain:8006/api2/json",
"insecure_skip_tls_verify": true,
"username": "{{user `username`}}",
"password": "{{user `password`}}",
"node": "my-proxmox",
"network_adapters": [
{
"bridge": "vmbr0"
}
],
"disks": [
{
"type": "scsi",
"disk_size": "5G",
"storage_pool": "local-lvm",
"storage_pool_type": "lvm"
}
],
"iso_file": "local:iso/Fedora-Server-dvd-x86_64-29-1.2.iso",
"http_directory": "config",
"boot_wait": "10s",
"boot_command": [
"<up><tab> ip=dhcp inst.cmdline inst.ks=http://{{.HTTPIP}}:{{.HTTPPort}}/ks.cfg<enter>"
],
"ssh_username": "root",
"ssh_timeout": "15m",
"ssh_password": "packer",
"unmount_iso": true,
"template_name": "fedora-29",
"template_description": "Fedora 29-1.2, generated on {{ isotime \"2006-01-02T15:04:05Z\" }}"
}
]
}