Metalsmith Deployment
=====================

This role deploys instances using **metalsmith** CLI.

Variables
---------

The only required variable is:

``metalsmith_instances``
    list of instances to provision, see Instance_ for instance description.

The following optional variables provide the defaults for Instance_ attributes:

``metalsmith_candidates``
    the default for ``candidates``.
``metalsmith_capabilities``
    the default for ``capabilities``.
``metalsmith_conductor_group``
    the default for ``conductor_group``.
``metalsmith_extra_args``
    the default for ``extra_args``.
``metalsmith_image``
    the default for ``image``.
``metalsmith_image_checksum``
    the default for ``image_checksum``.
``metalsmith_image_kernel``
    the default for ``image_kernel``.
``metalsmith_image_ramdisk``
    the default for ``image_ramdisk``.
``metalsmith_netboot``
    the default for ``netboot``
``metalsmith_nics``
    the default for ``nics``.
``metalsmith_resource_class``
    the default for ``resource_class``.
``metalsmith_root_size``
    the default for ``root_size``.
``metalsmith_ssh_public_keys``
    the default for ``ssh_public_keys``.
``metalsmith_swap_size``
    the default for ``swap_size``.
``metalsmith_traits``
    the default for ``traits``.
``metalsmith_user_name``
    the default for ``user_name``, the default value is ``metalsmith``.

Instance
--------

Each instances has the following attributes:

``candidates`` (defaults to ``metalsmith_candidates``)
    list of nodes (UUIDs or names) to be considered for deployment.
``capabilities`` (defaults to ``metalsmith_capabilities``)
    node capabilities to request when scheduling.
``conductor_group`` (defaults to ``metalsmith_conductor_group``)
    conductor group to pick nodes from.

    .. note:: Currently it's not possible to specify the default group.

``extra_args`` (defaults to ``metalsmith_extra_args``)
    additional arguments to pass to the ``metalsmith`` CLI on all calls.
``image`` (defaults to ``metalsmith_image``)
    UUID, name or HTTP(s) URL of the image to use for deployment. Mandatory.
``image_checksum`` (defaults to ``metalsmith_image_checksum``)
    MD5 checksum or checksum file URL for an HTTP(s) image.
``image_kernel`` (defaults to ``metalsmith_image_kernel``)
    URL of the kernel image if and only if the ``image`` is a URL of
    a partition image.
``image_ramdisk`` (defaults to ``metalsmith_image_ramdisk``)
    URL of the ramdisk image if and only if the ``image`` is a URL of
    a partition image.
``netboot``
    whether to boot the deployed instance from network (PXE, iPXE, etc).
    The default is to use local boot (requires a bootloader on the image).
``nics`` (defaults to ``metalsmith_nics``)
    list of virtual NICs to attach to node's physical NICs. Each is an object
    with exactly one attribute:

    ``network``
        creates a port on the given network, for example:

        .. code-block:: yaml

            nics:
              - network: private
              - network: ctlplane

        can optionally take a fixed IP to assign:

        .. code-block:: yaml

            nics:
              - network: private
                fixed_ip: 10.0.0.2
              - network: ctlplane
                fixed_ip: 192.168.42.30

    ``port``
        uses the provided pre-created port:

        .. code-block:: yaml

            nics:
              - port: b2254316-7867-4615-9fb7-911b3f38ca2a

    ``subnet``
        creates a port on the given subnet, for example:

        .. code-block:: yaml

            nics:
              - subnet: private-subnet1

``resource_class`` (defaults to ``metalsmith_resource_class``)
    requested node's resource class.
``root_size`` (defaults to ``metalsmith_root_size``)
    size of the root partition (in GiB), if partition images are used.

    .. note::
        Also required for whole-disk images due to how the Bare Metal service
        currently works.

``ssh_public_keys`` (defaults to ``metalsmith_ssh_public_keys``)
    list of file names with SSH public keys to put to the node.
``swap_size`` (defaults to ``metalsmith_swap_size``)
    size of the swap partition (in MiB), if partition images are used
    (it's an error to set it for a whole disk image).
``traits``
    list of traits the node should have.
``user_name`` (defaults to ``metalsmith_user_name``)
    name of the user to create on the instance via configdrive. Requires
    cloud-init_ on the image.

.. _cloud-init: https://cloudinit.readthedocs.io/

Example
-------

.. code-block:: yaml

    ---
    - hosts: all
      tasks:
        - include_role:
            name: metalsmith_deployment
          vars:
            metalsmith_image: centos7
            metalsmith_nics:
              - network: ctlplane
            metalsmith_ssh_public_keys:
              - /home/user/.ssh/id_rsa.pub
            metalsmith_instances:
              - hostname: compute-0
                resource_class: compute
                root_size: 100
                swap_size: 4096
                capabilities:
                  boot_mode: uefi
                traits:
                  - CUSTOM_GPU
              - hostname: compute-1
                resource_class: compute
                root_size: 100
                swap_size: 4096
                capabilities:
                  boot_mode: uefi
                user_name: heat-admin
              - hostname: compute-2
                resource_class: compute
                candidates:
                  - e63650f2-4e7d-40b2-8932-f5b0e54698c7
                  - f19d00dd-60e1-46c8-b83c-782b4d291d9e
              - hostname: control-0
                resource_class: control
                capabilities:
                  boot_mode: uefi
                nics:
                  - network: ctlplane
                  - port: 1899af15-149d-47dc-b0dc-a68614eeb5c4
              - hostname: custom-partition-image
                resource_class: custom
                image: https://example.com/images/custom-1.0.root.img
                image_kernel: https://example.com/images/custom-1.0.vmlinuz
                image_ramdisk: https://example.com/images/custom-1.0.initrd
                image_checksum: https://example.com/images/MD5SUMS
              - hostname: custom-whole-disk-image
                resource_class: custom
                image: https://example.com/images/custom-1.0.qcow2
                image_checksum: https://example.com/images/MD5SUMS
