138 lines
4.1 KiB
ReStructuredText
138 lines
4.1 KiB
ReStructuredText
|
PreOS
|
||
|
=====
|
||
|
|
||
|
Description
|
||
|
-----------
|
||
|
With cdist you can install and configure new machines. You can use cdist to
|
||
|
create PreOS, minimal OS which purpose is to boot new machine.
|
||
|
After PreOS is booted machine is ready for installing desired OS and
|
||
|
then it is ready for configuration.
|
||
|
|
||
|
PreOS creation
|
||
|
--------------
|
||
|
With cdist you can create PreOS.
|
||
|
Currently supported PreOS-es include:
|
||
|
|
||
|
* debian
|
||
|
* ubuntu
|
||
|
* devuan.
|
||
|
|
||
|
PreOS is created using cdist preos command. preos command has subcommands that
|
||
|
create the desired PreOS.
|
||
|
|
||
|
For example, to create ubuntu PreOS:
|
||
|
|
||
|
.. code-block:: sh
|
||
|
|
||
|
$ cdist preos ubuntu /preos/preos-ubuntu -b -C \
|
||
|
-k ~/.ssh/id_rsa.pub -p /preos/pxe-ubuntu
|
||
|
|
||
|
For more info about available options see cdist manual page.
|
||
|
|
||
|
This will bootstrap (``-b``) ubuntu PreOS in ``/preos/preos-ubuntu`` directory, it
|
||
|
will be configured (``-C``) using default built-in initial manifest and with
|
||
|
specified ssh authorized key (``-k``).
|
||
|
After bootstrapping and configuration PXE
|
||
|
boot directory will be created (``-p``) in ``/preos/pxe-ubuntu``.
|
||
|
|
||
|
After PreOS is created new machines can be booted using created PXE (after
|
||
|
proper dhcp, tftp setting).
|
||
|
|
||
|
Since PreOS is configured with ssh authorized key it can be accessed throguh
|
||
|
ssh, i.e. it can be further installed and configured with cdist.
|
||
|
|
||
|
Implementing new PreOS sub-command
|
||
|
----------------------------------
|
||
|
preos command is implemented as a plugin system. This plugin system scans for
|
||
|
preos subcommands in ``cdist/preos/`` distribution directory and also in
|
||
|
``~/.cdist/preos/`` directory if it exists.
|
||
|
|
||
|
preos subcommand is a module or a class that satisfies the following:
|
||
|
|
||
|
* it has attribute ``_cdist_preos`` set to ``True``
|
||
|
* it has function/method ``commandline``.
|
||
|
|
||
|
For a module based preos subcommand ``commandline`` function accepts a module
|
||
|
object as its first argument and the list of command line
|
||
|
arguments (``sys.argv[2:]``).
|
||
|
|
||
|
For a class preos subcommand ``commandline`` method should be staticmethod and
|
||
|
it accepts a class object as its first argument and the list of command line
|
||
|
arguments(``sys.argv[2:]``).
|
||
|
|
||
|
If preos scanning finds a module/class that has ``_cdist_preos`` set
|
||
|
to ``True`` and it has function/method ``commandline`` then this module/class is
|
||
|
registered to preos subcommands. The name of the command is set to ``_preos_name``
|
||
|
attribute if it exists, otherwise it is set to the module/class name, lowercase.
|
||
|
When registered preos subcommand is specified as preos command then ``commandline``
|
||
|
will be called with first argument set to module/class object and second argument
|
||
|
set to ``sys.argv[2:]``.
|
||
|
|
||
|
Example writing new dummy preos sub-command
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
Module based preos:
|
||
|
^^^^^^^^^^^^^^^^^^^
|
||
|
|
||
|
#. Create directory ``~/.cdist/preos/`` if it does not exist
|
||
|
#. Create ``~/.cdist/preos/netbsd.py`` with the following contents:
|
||
|
|
||
|
.. code-block:: python
|
||
|
|
||
|
_preos_name = 'netbsd'
|
||
|
_cdist_preos = True
|
||
|
|
||
|
def commandline(cls, args):
|
||
|
print("NetBSD PreOS: {}".format(args))
|
||
|
|
||
|
When you try to run this new preos you will get:
|
||
|
|
||
|
.. code-block:: sh
|
||
|
|
||
|
$ cdist preos -h
|
||
|
usage: cdist preos [-h] preos
|
||
|
|
||
|
Create PreOS
|
||
|
|
||
|
positional arguments:
|
||
|
preos PreOS to create, one of: {'netbsd', 'debian', 'ubuntu'}
|
||
|
|
||
|
optional arguments:
|
||
|
-h, --help show this help message and exit
|
||
|
$ cdist preos netbsd
|
||
|
NetBSD PreOS: []
|
||
|
|
||
|
Class based preos:
|
||
|
^^^^^^^^^^^^^^^^^^
|
||
|
|
||
|
#. Create directory ``~/.cdist/preos/`` if it does not exist
|
||
|
#. Create ``~/.cdist/preos/freebsd.py`` with the following contents:
|
||
|
|
||
|
.. code-block:: python
|
||
|
|
||
|
class FreeBSD(object):
|
||
|
_cdist_preos = True
|
||
|
|
||
|
@classmethod
|
||
|
def commandline(cls, args):
|
||
|
print("FreeBSD dummy preos: {}".format(args))
|
||
|
|
||
|
When you try to run this new preos you will get:
|
||
|
|
||
|
.. code-block:: sh
|
||
|
|
||
|
$ cdist preos -h
|
||
|
usage: cdist preos [-h] preos
|
||
|
|
||
|
Create PreOS
|
||
|
|
||
|
positional arguments:
|
||
|
preos PreOS to create, one of: {'freebsd', 'debian', 'ubuntu'}
|
||
|
|
||
|
optional arguments:
|
||
|
-h, --help show this help message and exit
|
||
|
$ cdist preos freebsd
|
||
|
FreeBSD dummy preos: []
|
||
|
|
||
|
In the ``commandline`` function/method you have all the freedom to actually create
|
||
|
PreOS.
|