]> git.proxmox.com Git - pve-docs.git/blame_incremental - qm-cloud-init.adoc
Merge branch 'taskset' into taskset-merged
[pve-docs.git] / qm-cloud-init.adoc
... / ...
CommitLineData
1[[qm_cloud_init]]
2Cloud-Init Support
3------------------
4ifdef::wiki[]
5:pve-toplevel:
6endif::wiki[]
7
8https://cloudinit.readthedocs.io[Cloud-Init] is the de facto
9multi-distribution package that handles early initialization of a
10virtual machine instance. Using Cloud-Init, configuration of network
11devices and ssh keys on the hypervisor side is possible. When the VM
12starts for the first time, the Cloud-Init software inside the VM will
13apply those settings.
14
15Many Linux distributions provide ready-to-use Cloud-Init images, mostly
16designed for 'OpenStack'. These images will also work with {pve}. While
17it may seem convenient to get such ready-to-use images, we usually
18recommended to prepare the images by yourself. The advantage is that you
19will know exactly what you have installed, and this helps you later to
20easily customize the image for your needs.
21
22Once you have created such a Cloud-Init image we recommend to convert it
23into a VM template. From a VM template you can quickly create linked
24clones, so this is a fast method to roll out new VM instances. You just
25need to configure the network (and maybe the ssh keys) before you start
26the new VM.
27
28We recommend using SSH key-based authentication to login to the VMs
29provisioned by Cloud-Init. It is also possible to set a password, but
30this is not as safe as using SSH key-based authentication because {pve}
31needs to store an encrypted version of that password inside the
32Cloud-Init data.
33
34{pve} generates an ISO image to pass the Cloud-Init data to the VM. For
35that purpose, all Cloud-Init VMs need to have an assigned CD-ROM drive.
36Usually, a serial console should be added and used as a display. Many Cloud-Init
37images rely on this, it is a requirement for OpenStack. However, other images
38might have problems with this configuration. Switch back to the default display
39configuration if using a serial console doesn't work.
40
41
42Preparing Cloud-Init Templates
43~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44
45The first step is to prepare your VM. Basically you can use any VM.
46Simply install the Cloud-Init packages inside the VM that you want to
47prepare. On Debian/Ubuntu based systems this is as simple as:
48
49----
50apt-get install cloud-init
51----
52
53WARNING: This command is *not* intended to be executed on the {pve} host, but
54only inside the VM.
55
56Already many distributions provide ready-to-use Cloud-Init images (provided
57as `.qcow2` files), so alternatively you can simply download and
58import such images. For the following example, we will use the cloud
59image provided by Ubuntu at https://cloud-images.ubuntu.com.
60
61----
62# download the image
63wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
64
65# create a new VM
66qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0
67
68# import the downloaded disk to local-lvm storage
69qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm
70
71# finally attach the new disk to the VM as scsi drive
72qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1
73----
74
75NOTE: Ubuntu Cloud-Init images require the `virtio-scsi-pci`
76controller type for SCSI drives.
77
78.Add Cloud-Init CD-ROM drive
79
80[thumbnail="screenshot/gui-cloudinit-hardware.png"]
81
82The next step is to configure a CD-ROM drive, which will be used to pass
83the Cloud-Init data to the VM.
84
85----
86qm set 9000 --ide2 local-lvm:cloudinit
87----
88
89To be able to boot directly from the Cloud-Init image, set the
90`bootdisk` parameter to `scsi0`, and restrict BIOS to boot from disk
91only. This will speed up booting, because VM BIOS skips the testing for
92a bootable CD-ROM.
93
94----
95qm set 9000 --boot c --bootdisk scsi0
96----
97
98For many Cloud-Init images, it is required to configure a serial console and use
99it as a display. If the configuration doesn't work for a given image however,
100switch back to the default display instead.
101
102----
103qm set 9000 --serial0 socket --vga serial0
104----
105
106In a last step, it is helpful to convert the VM into a template. From
107this template you can then quickly create linked clones.
108The deployment from VM templates is much faster than creating a full
109clone (copy).
110----
111qm template 9000
112----
113
114
115Deploying Cloud-Init Templates
116~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117
118[thumbnail="screenshot/gui-cloudinit-config.png"]
119
120You can easily deploy such a template by cloning:
121
122----
123qm clone 9000 123 --name ubuntu2
124----
125
126Then configure the SSH public key used for authentication, and configure
127the IP setup:
128
129----
130qm set 123 --sshkey ~/.ssh/id_rsa.pub
131qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
132----
133
134You can also configure all the Cloud-Init options using a single command
135only. We have simply split the above example to separate the
136commands for reducing the line length. Also make sure to adopt the IP
137setup for your specific environment.
138
139
140Custom Cloud-Init Configuration
141~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142
143The Cloud-Init integration also allows custom config files to be used instead
144of the automatically generated configs. This is done via the `cicustom`
145option on the command line:
146
147----
148qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"
149----
150
151The custom config files have to be on a storage that supports snippets and have
152to be available on all nodes the VM is going to be migrated to. Otherwise the
153VM won't be able to start.
154For example:
155
156----
157qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"
158----
159
160There are three kinds of configs for Cloud-Init. The first one is the `user`
161config as seen in the example above. The second is the `network` config and
162the third the `meta` config. They can all be specified together or mixed
163and matched however needed.
164The automatically generated config will be used for any that don't have a
165custom config file specified.
166
167The generated config can be dumped to serve as a base for custom configs:
168
169----
170qm cloudinit dump 9000 user
171----
172
173The same command exists for `network` and `meta`.
174
175
176Cloud-Init specific Options
177~~~~~~~~~~~~~~~~~~~~~~~~~~~
178
179include::qm-cloud-init-opts.adoc[]
180
181
182ifdef::wiki[]
183
184See Also
185~~~~~~~~
186
187* link:/wiki/Qemu/KVM_Virtual_Machines[Qemu/KVM Virtual Machines]
188
189endif::wiki[]