summaryrefslogtreecommitdiff
path: root/doc/rtd/reference/datasources/nocloud.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rtd/reference/datasources/nocloud.rst')
-rw-r--r--doc/rtd/reference/datasources/nocloud.rst221
1 files changed, 221 insertions, 0 deletions
diff --git a/doc/rtd/reference/datasources/nocloud.rst b/doc/rtd/reference/datasources/nocloud.rst
new file mode 100644
index 00000000..682c8477
--- /dev/null
+++ b/doc/rtd/reference/datasources/nocloud.rst
@@ -0,0 +1,221 @@
+.. _datasource_nocloud:
+
+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:
+
+* ``h`` or ``local-hostname``
+* ``i`` or ``instance-id``
+* ``s`` or ``seedfrom``
+
+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 :file:`/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.
+
+.. list-table:: Available DMI variables for expansion in ``seedfrom`` URL
+ :widths: 35 35 30
+ :header-rows: 0
+
+ * - ``dmi.baseboard-asset-tag``
+ - ``dmi.baseboard-manufacturer``
+ - ``dmi.baseboard-version``
+ * - ``dmi.bios-release-date``
+ - ``dmi.bios-vendor``
+ - ``dmi.bios-version``
+ * - ``dmi.chassis-asset-tag``
+ - ``dmi.chassis-manufacturer``
+ - ``dmi.chassis-serial-number``
+ * - ``dmi.chassis-version``
+ - ``dmi.system-manufacturer``
+ - ``dmi.system-product-name``
+ * - ``dmi.system-serial-number``
+ - ``dmi.system-uuid``
+ - ``dmi.system-version``
+
+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 :file:`/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 :ref:`user data<user_data_formats>` 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
+:ref:`user data formats<user_data_formats>` at the same base URL: ::
+
+ /vendor-data
+
+Creating a disk
+===============
+
+Given a disk Ubuntu cloud image in :file:`disk.img`, you can create a
+sufficient disk by following the following example.
+
+1. Create the :file:`user-data` and :file:`meta-data` files that will be used
+ to modify the image on first boot.
+
+.. code-block:: sh
+
+ $ 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
+
+2. At this stage you have three options:
+
+ a. Create a disk to attach with some user data and metadata:
+
+ .. code-block:: sh
+
+ $ genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
+
+ b. Alternatively, create a ``vfat`` filesystem with the same files:
+
+ .. code-block:: sh
+
+ $ truncate --size 2M seed.iso
+ $ mkfs.vfat -n cidata seed.iso
+
+ * 2b) Option 1: mount and copy files:
+
+ .. code-block:: sh
+
+ $ sudo mount -t vfat seed.iso /mnt
+ $ sudo cp user-data meta-data /mnt
+ $ sudo umount /mnt
+
+ * 2b) Option 2: the ``mtools`` package provides ``mcopy``, which can
+ access ``vfat`` filesystems without mounting them:
+
+ .. code-block::
+
+ $ mcopy -oi seed.iso user-data meta-data
+
+3. Create a new qcow image to boot, backed by your original image:
+
+.. code-block:: sh
+
+ $ qemu-img create -f qcow2 -b disk.img -F qcow2 boot-disk.img
+
+4. Boot the image and log in as "Ubuntu" with password "passw0rd":
+
+.. code-block:: sh
+
+ $ 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 :file:`/etc/network/interfaces` file by providing the
+content for that file in the ``network-interfaces`` field of
+:file:`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
+:ref:`network_config_v1` or :ref:`network_config_v2` by providing that
+YAML formatted data in a file named :file:`network-config`. If found,
+this file will override a :file:`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
+--------------
+
+.. code-block:: yaml
+
+ 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
+
+
+.. code-block:: yaml
+
+ 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
+
+
+.. _iso9660: https://en.wikipedia.org/wiki/ISO_9660
+.. _vfat: https://en.wikipedia.org/wiki/File_Allocation_Table