[[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. 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[]