NoCloud#
The data source NoCloud allows the user to provide user data and metadata
to the instance without running a network service (or even without having a
network at all).
You can provide metadata and user data to a local VM boot via files on a
vfat or iso9660 filesystem. The filesystem volume label must be
cidata or CIDATA.
Alternatively, you can provide metadata via the kernel command line or SMBIOS “serial number” option. The data must be passed in the form of a string:
ds=nocloud[;key=val;key=val]
or,
ds=nocloud-net[;key=val;key=val]
Permitted keys#
The permitted keys are:
horlocal-hostnameiorinstance-idsorseedfrom
With ds=nocloud, the seedfrom value must start with / or
file://. With ds=nocloud-net, the seedfrom value must start
with http:// or https:// and end with a trailing /.
Cloud-init performs variable expansion of the seedfrom URL for any DMI
kernel variables present in /sys/class/dmi/id (kenv on FreeBSD).
Your seedfrom URL can contain variable names of the format
__dmi.varname__ to indicate to the cloud-init NoCloud datasource that
dmi.varname should be expanded to the value of the DMI system attribute
wanted.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
For example, you can pass this option to QEMU:
-smbios type=1,serial=ds=nocloud-net;s=http://10.10.0.1:8000/__dmi.chassis-serial-number__/
This will cause NoCloud to fetch the full metadata from a URL based on
YOUR_SERIAL_NUMBER as seen in /sys/class/dmi/id/chassis_serial_number
(kenv on FreeBSD) from http://10.10.0.1:8000/YOUR_SERIAL_NUMBER/meta-data after
the network initialisation is complete.
File formats#
These user data and metadata files are required as separate files at the same base URL:
/user-data
/meta-data
Both files must be present for it to be considered a valid seed ISO.
Basically, user-data is simply user data and
meta-data is a YAML-formatted file representing what you’d find in the EC2
metadata service.
You may also optionally provide a vendor data file adhering to user data formats at the same base URL:
/vendor-data
Creating a disk#
Given a disk Ubuntu cloud image in disk.img, you can create a
sufficient disk by following the following example.
Create the
user-dataandmeta-datafiles that will be used to modify the image on first boot.
$ echo -e "instance-id: iid-local01\nlocal-hostname: cloudimg" > meta-data
$ echo -e "#cloud-config\npassword: passw0rd\nchpasswd: { expire: False }\nssh_pwauth: True\n" > user-data
At this stage you have three options:
Create a disk to attach with some user data and metadata:
$ genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
Alternatively, create a
vfatfilesystem with the same files:$ truncate --size 2M seed.iso $ mkfs.vfat -n cidata seed.iso
2b) Option 1: mount and copy files:
$ sudo mount -t vfat seed.iso /mnt $ sudo cp user-data meta-data /mnt $ sudo umount /mnt
2b) Option 2: the
mtoolspackage providesmcopy, which can accessvfatfilesystems without mounting them:$ mcopy -oi seed.iso user-data meta-data
Create a new qcow image to boot, backed by your original image:
$ qemu-img create -f qcow2 -b disk.img -F qcow2 boot-disk.img
Boot the image and log in as “Ubuntu” with password “passw0rd”:
$ kvm -m 256 \
-net nic -net user,hostfwd=tcp::2222-:22 \
-drive file=boot-disk.img,if=virtio \
-drive driver=raw,file=seed.iso,if=virtio
Note
Note that “passw0rd” was set as password through the user data above. There is no password set on these images.
Note
The instance-id provided (iid-local01 above) is what is used to
determine if this is “first boot”. So, if you are making updates to
user data you will also have to change the instance-id, or start the
disk fresh.
Also, you can inject an /etc/network/interfaces file by providing the
content for that file in the network-interfaces field of
meta-data.
Example meta-data#
instance-id: iid-abcdefg
network-interfaces: |
iface eth0 inet static
address 192.168.1.10
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.254
hostname: myhost
Network configuration can also be provided to cloud-init in either
Networking config Version 1 or Networking config Version 2 by providing that
YAML formatted data in a file named network-config. If found,
this file will override a network-interfaces file.
See an example below. Note specifically that this file does not
have a top level network key as it is already assumed to
be network configuration based on the filename.
Example config#
version: 1
config:
- type: physical
name: interface0
mac_address: "52:54:00:12:34:00"
subnets:
- type: static
address: 192.168.1.10
netmask: 255.255.255.0
gateway: 192.168.1.254
version: 2
ethernets:
interface0:
match:
macaddress: "52:54:00:12:34:00"
set-name: interface0
addresses:
- 192.168.1.10/255.255.255.0
gateway4: 192.168.1.254