summaryrefslogtreecommitdiff
path: root/doc/rtd/reference/datasources/smartos.rst
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rtd/reference/datasources/smartos.rst')
-rw-r--r--doc/rtd/reference/datasources/smartos.rst181
1 files changed, 181 insertions, 0 deletions
diff --git a/doc/rtd/reference/datasources/smartos.rst b/doc/rtd/reference/datasources/smartos.rst
new file mode 100644
index 00000000..fba87931
--- /dev/null
+++ b/doc/rtd/reference/datasources/smartos.rst
@@ -0,0 +1,181 @@
+.. _datasource_smartos:
+
+SmartOS Datasource
+******************
+
+This datasource finds metadata and user data from the SmartOS virtualisation
+platform (i.e., Joyent).
+
+Please see http://smartos.org/ for information about SmartOS.
+
+SmartOS platform
+================
+
+The SmartOS virtualisation platform uses metadata from the instance via the
+second serial console. On Linux, this is :file:`/dev/ttyS1`. The data is
+provided via a simple protocol:
+
+* Something queries for the data,
+* the console responds with the status, and
+* if "SUCCESS" returns until a single ".\n".
+
+New versions of the SmartOS tooling will include support for Base64-encoded
+data.
+
+Metadata channels
+=================
+
+``Cloud-init`` supports three modes of delivering user data and metadata via
+the flexible channels of SmartOS.
+
+1. User data is written to :file:`/var/db/user-data`:
+
+ - As per the spec, user data is for consumption by the end user, not
+ provisioning tools.
+ - ``Cloud-init`` ignores this channel, other than writing it to disk.
+ - Removal of the ``meta-data`` key means that :file:`/var/db/user-data`
+ gets removed.
+ - A backup of previous metadata is maintained as
+ :file:`/var/db/user-data.<timestamp>`. ``<timestamp>`` is the epoch time
+ when ``cloud-init`` ran.
+
+2. ``user-script`` is written to
+ :file:`/var/lib/cloud/scripts/per-boot/99_user_data`:
+
+ - This is executed each boot.
+ - A link is created to :file:`/var/db/user-script`.
+ - Previous versions of ``user-script`` is written to
+ :file:`/var/lib/cloud/scripts/per-boot.backup/99_user_script.<timestamp>.`
+ - <timestamp> is the epoch time when ``cloud-init`` ran.
+ - When the ``user-script`` metadata key goes missing, ``user-script`` is
+ removed from the file system, although a backup is maintained.
+ - If the script does not start with a shebang (i.e., it starts with
+ #!<executable>), or it is not an executable, ``cloud-init`` will add a
+ shebang of "#!/bin/bash".
+
+3. ``Cloud-init`` user data is treated like on other Clouds.
+
+ - This channel is used for delivering ``_all_ cloud-init`` instructions.
+ - Scripts delivered over this channel must be well formed (i.e., they must
+ have a shebang).
+
+``Cloud-init`` supports reading the traditional metadata fields supported by
+the SmartOS tools. These are:
+
+* ``root_authorized_keys``
+* ``hostname``
+* ``enable_motd_sys_info``
+* ``iptables_disable``
+
+.. note::
+ At this time, ``iptables_disable`` and ``enable_motd_sys_info`` are read
+ but are not actioned.
+
+Disabling ``user-script``
+=========================
+
+``Cloud-init`` uses the per-boot script functionality to handle the execution
+of the ``user-script``. If you want to prevent this, use a cloud-config of:
+
+.. code-block:: yaml
+
+ #cloud-config
+ cloud_final_modules:
+ - scripts-per-once
+ - scripts-per-instance
+ - scripts-user
+ - ssh-authkey-fingerprints
+ - keys-to-console
+ - phone-home
+ - final-message
+ - power-state-change
+
+Alternatively you can use the JSON patch method:
+
+.. code-block:: yaml
+
+ #cloud-config-jsonp
+ [
+ { "op": "replace",
+ "path": "/cloud_final_modules",
+ "value": ["scripts-per-once",
+ "scripts-per-instance",
+ "scripts-user",
+ "ssh-authkey-fingerprints",
+ "keys-to-console",
+ "phone-home",
+ "final-message",
+ "power-state-change"]
+ }
+ ]
+
+The default cloud-config includes "script-per-boot". ``Cloud-init`` will still
+ingest and write the user data, but will not execute it when you disable
+the per-boot script handling.
+
+The cloud-config needs to be delivered over the ``cloud-init:user-data``
+channel in order for ``cloud-init`` to ingest it.
+
+.. note::
+ Unless you have an explicit use-case, it is recommended that you do not
+ disable the per-boot script execution, especially if you are using
+ any of the life-cycle management features of SmartOS.
+
+Base64
+======
+
+The following are exempt from Base64 encoding, owing to the fact that they
+are provided by SmartOS:
+
+* ``root_authorized_keys``
+* ``enable_motd_sys_info``
+* ``iptables_disable``
+* ``user-data``
+* ``user-script``
+
+This list can be changed through the
+:ref:`datasource base configuration<base_config-Datasource>` variable
+``no_base64_decode``.
+
+This means that ``user-script``, ``user-data`` and other values can be Base64
+encoded. Since ``cloud-init`` can only guess whether or not something
+is truly Base64 encoded, the following metadata keys are hints as to whether
+or not to Base64 decode something:
+
+* ``base64_all``: Except for excluded keys, attempt to Base64 decode the
+ values. If the value fails to decode properly, it will be returned in its
+ text.
+* ``base64_keys``: A comma-delimited list of which keys are Base64 encoded.
+* ``b64-<key>``: For any key, if an entry exists in the metadata for
+ ``'b64-<key>'``, then ``'b64-<key>'`` is expected to be a plain-text boolean
+ indicating whether or not its value is encoded.
+* ``no_base64_decode``: This is a configuration setting
+ (i.e., :file:`/etc/cloud/cloud.cfg.d`) that sets which values should not
+ be Base64 decoded.
+
+``disk_aliases`` and ephemeral disk
+===================================
+
+By default, SmartOS only supports a single ephemeral disk. That disk is
+completely empty (un-partitioned, with no filesystem).
+
+The SmartOS datasource has built-in cloud-config which instructs the
+``disk_setup`` module to partition and format the ephemeral disk.
+
+You can control the ``disk_setup`` in 2 ways:
+
+1. Through the datasource config, you can change the 'alias' of ``ephermeral0``
+ to reference another device. The default is:
+
+ .. code-block::
+
+ 'disk_aliases': {'ephemeral0': '/dev/vdb'}
+
+ This means that anywhere ``disk_setup`` sees a device named 'ephemeral0',
+ then :file:`/dev/vdb` will be substituted.
+
+2. You can provide ``disk_setup`` or ``fs_setup`` data in ``user-data`` to
+ overwrite the datasource's built-in values.
+
+See :file:`doc/examples/cloud-config-disk-setup.txt` for information on
+``disk_setup``.