mirror of
				https://git.proxmox.com/git/pve-docs
				synced 2025-11-04 07:37:03 +00:00 
			
		
		
		
	Adds documentation for the cloudinit snippets support and how 'qm cloudinit dump' can be used to get a base config file. Signed-off-by: Mira Limbeck <m.limbeck@proxmox.com>
		
			
				
	
	
		
			184 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
[[qm_cloud_init]]
 | 
						|
Cloud-Init Support
 | 
						|
------------------
 | 
						|
ifdef::wiki[]
 | 
						|
:pve-toplevel:
 | 
						|
endif::wiki[]
 | 
						|
 | 
						|
http://cloudinit.readthedocs.io[Cloud-Init] is the defacto
 | 
						|
multi-distribution package that handles early initialization of a
 | 
						|
virtual machine instance. Using Cloud-Init, configuration of network
 | 
						|
devices and ssh keys on the hypervisor side is possible. When the VM
 | 
						|
starts for the first time, the Cloud-Init software inside the VM will
 | 
						|
apply those settings.
 | 
						|
 | 
						|
Many Linux distributions provide ready-to-use Cloud-Init images, mostly
 | 
						|
designed for 'OpenStack'. These images will also work with {pve}. While
 | 
						|
it may seem convenient to get such ready-to-use images, we usually
 | 
						|
recommended to prepare the images by yourself. The advantage is that you
 | 
						|
will know exactly what you have installed, and this helps you later to
 | 
						|
easily customize the image for your needs.
 | 
						|
 | 
						|
Once you have created such a Cloud-Init image we recommend to convert it
 | 
						|
into a VM template. From a VM template you can quickly create linked
 | 
						|
clones, so this is a fast method to roll out new VM instances. You just
 | 
						|
need to configure the network (and maybe the ssh keys) before you start
 | 
						|
the new VM.
 | 
						|
 | 
						|
We recommend using SSH key-based authentication to login to the VMs
 | 
						|
provisioned by Cloud-Init. It is also possible to set a password, but
 | 
						|
this is not as safe as using SSH key-based authentication because {pve}
 | 
						|
needs to store an encrypted version of that password inside the
 | 
						|
Cloud-Init data.
 | 
						|
 | 
						|
{pve} generates an ISO image to pass the Cloud-Init data to the VM. For
 | 
						|
that purpose all Cloud-Init VMs need to have an assigned CDROM drive.
 | 
						|
Also many Cloud-Init images assume to have a serial console, so it is
 | 
						|
recommended to add a serial console and use it as display for those VMs.
 | 
						|
 | 
						|
 | 
						|
Preparing Cloud-Init Templates
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The first step is to prepare your VM. Basically you can use any VM.
 | 
						|
Simply install the Cloud-Init packages inside the VM that you want to
 | 
						|
prepare. On Debian/Ubuntu based systems this is as simple as:
 | 
						|
 | 
						|
----
 | 
						|
apt-get install cloud-init
 | 
						|
----
 | 
						|
 | 
						|
Already many distributions provide ready-to-use Cloud-Init images (provided
 | 
						|
as `.qcow2` files), so alternatively you can simply download and
 | 
						|
import such images. For the following example, we will use the cloud
 | 
						|
image provided by Ubuntu at https://cloud-images.ubuntu.com.
 | 
						|
 | 
						|
----
 | 
						|
# download the image
 | 
						|
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
 | 
						|
 | 
						|
# create a new VM
 | 
						|
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0
 | 
						|
 | 
						|
# import the downloaded disk to local-lvm storage
 | 
						|
qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm
 | 
						|
 | 
						|
# finally attach the new disk to the VM as scsi drive
 | 
						|
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1
 | 
						|
----
 | 
						|
 | 
						|
NOTE: Ubuntu Cloud-Init images require the `virtio-scsi-pci`
 | 
						|
controller type for SCSI drives.
 | 
						|
 | 
						|
.Add Cloud-Init CDROM drive
 | 
						|
 | 
						|
[thumbnail="screenshot/gui-cloudinit-hardware.png"]
 | 
						|
 | 
						|
The next step is to configure a CDROM drive which will be used to pass
 | 
						|
the Cloud-Init data to the VM.
 | 
						|
 | 
						|
----
 | 
						|
qm set 9000 --ide2 local-lvm:cloudinit
 | 
						|
----
 | 
						|
 | 
						|
To be able to boot directly from the Cloud-Init image, set the
 | 
						|
`bootdisk` parameter to `scsi0`, and restrict BIOS to boot from disk
 | 
						|
only. This will speed up booting, because VM BIOS skips the testing for
 | 
						|
a bootable CDROM.
 | 
						|
 | 
						|
----
 | 
						|
qm set 9000 --boot c --bootdisk scsi0
 | 
						|
----
 | 
						|
 | 
						|
Also configure a serial console and use it as a display. Many Cloud-Init
 | 
						|
images rely on this, as it is an requirement for OpenStack images.
 | 
						|
 | 
						|
----
 | 
						|
qm set 9000 --serial0 socket --vga serial0
 | 
						|
----
 | 
						|
 | 
						|
In a last step, it is helpful to convert the VM into a template. From
 | 
						|
this template you can then quickly create linked clones.
 | 
						|
The deployment from VM templates is much faster than creating a full
 | 
						|
clone (copy).
 | 
						|
----
 | 
						|
qm template 9000
 | 
						|
----
 | 
						|
 | 
						|
 | 
						|
Deploying Cloud-Init Templates
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
[thumbnail="screenshot/gui-cloudinit-config.png"]
 | 
						|
 | 
						|
You can easily deploy such a template by cloning:
 | 
						|
 | 
						|
----
 | 
						|
qm clone 9000 123 --name ubuntu2
 | 
						|
----
 | 
						|
 | 
						|
Then configure the SSH public key used for authentication, and configure
 | 
						|
the IP setup:
 | 
						|
 | 
						|
----
 | 
						|
qm set 123 --sshkey ~/.ssh/id_rsa.pub
 | 
						|
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
 | 
						|
----
 | 
						|
 | 
						|
You can also configure all the Cloud-Init options using a single command
 | 
						|
only. We have simply splitted the above example to separate the
 | 
						|
commands for reducing the line length. Also make sure to adopt the IP
 | 
						|
setup for your specific environment.
 | 
						|
 | 
						|
 | 
						|
Custom Cloud-Init Configuration
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The Cloud-Init integration also allows custom config files to be used instead
 | 
						|
of the automatically generated configs. This is done via the `cicustom`
 | 
						|
option on the command line:
 | 
						|
 | 
						|
----
 | 
						|
qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"
 | 
						|
----
 | 
						|
 | 
						|
The custom config files have to be on a storage that supports snippets and have
 | 
						|
to be available on all nodes the VM is going to be migrated to. Otherwise the
 | 
						|
VM won't be able to start.
 | 
						|
For example:
 | 
						|
 | 
						|
----
 | 
						|
qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"
 | 
						|
----
 | 
						|
 | 
						|
There are three kinds of configs for Cloud-Init. The first one is the `user`
 | 
						|
config as seen in the example above. The second is the `network` config and
 | 
						|
the third the `meta` config. They can all be specified together or mixed
 | 
						|
and matched however needed.
 | 
						|
The automatically generated config will be used for any that don't have a
 | 
						|
custom config file specified.
 | 
						|
 | 
						|
The generated config can be dumped to serve as a base for custom configs:
 | 
						|
 | 
						|
----
 | 
						|
qm cloudinit dump 9000 user
 | 
						|
----
 | 
						|
 | 
						|
The same command exists for `network` and `meta`.
 | 
						|
 | 
						|
 | 
						|
Cloud-Init specific Options
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
include::qm-cloud-init-opts.adoc[]
 | 
						|
 | 
						|
 | 
						|
ifdef::wiki[]
 | 
						|
 | 
						|
See Also
 | 
						|
~~~~~~~~
 | 
						|
 | 
						|
* link:/wiki/Qemu/KVM_Virtual_Machines[Qemu/KVM Virtual Machines]
 | 
						|
 | 
						|
endif::wiki[]
 |