Files
BastilleBSD_bastille/docs/chapters/template.rst

270 lines
11 KiB
ReStructuredText
Raw Normal View History

2018-11-24 20:07:20 -07:00
Template
========
2023-02-25 00:37:46 -08:00
Looking for ready made CI/CD validated `Bastille Templates`_?
2018-11-24 20:07:20 -07:00
Bastille supports a templating system allowing you to apply files, pkgs and
2019-11-20 19:16:21 -07:00
execute commands inside the containers automatically.
2018-11-24 20:07:20 -07:00
Currently supported template hooks are: ``ARG``, ``CMD``, ``CONFIG``, ``CP``,
``INCLUDE``, ``LIMITS``, ``MOUNT``, ``OVERLAY``, ``PKG``, ``RDR``, ``RENDER``,
``RESTART``, ``SERVICE``, ``SYSRC``.
2018-11-24 20:07:20 -07:00
Templates are created in ``${bastille_prefix}/templates`` and can leverage any
of the template hooks.
2018-11-24 20:07:20 -07:00
2021-07-14 15:49:12 -06:00
Bastille 0.7.x+
---------------
2020-07-13 19:27:23 -06:00
Bastille 0.7.x introduces a template syntax that is more flexible and allows
any-order scripting. Previous versions had a hard template execution order and
instructions were spread across multiple files. The new syntax is done in a
2025-04-10 06:53:03 -06:00
``Bastillefile`` and the template hook (see below) files are replaced with
2020-07-13 19:27:23 -06:00
template hook commands.
2018-11-24 20:07:20 -07:00
2020-07-13 19:27:23 -06:00
Template Automation Hooks
-------------------------
2018-11-24 20:07:20 -07:00
2025-04-02 23:52:33 -06:00
+---------------+---------------------+-----------------------------------------+
| HOOK | format | example |
+===============+=====================+=========================================+
| ARG | ARG=VALUE | MINECRAFT_MEMX="1024M" |
+---------------+---------------------+-----------------------------------------+
| CMD | /bin/sh command | /usr/bin/chsh -s /usr/local/bin/zsh |
+---------------+---------------------+-----------------------------------------+
| CONFIG | set property value | set allow.mlock 1 |
+---------------+---------------------+-----------------------------------------+
| CP/OVERLAY | path(s) | etc root usr (one per line) |
+---------------+---------------------+-----------------------------------------+
| INCLUDE | template path/URL | http?://TEMPLATE_URL or project/path |
+---------------+---------------------+-----------------------------------------+
| LIMITS | resource value | memoryuse 1G |
+---------------+---------------------+-----------------------------------------+
| LINE_IN_FILE | line file_path | word /usr/local/word/word.conf |
+---------------+---------------------+-----------------------------------------+
| MOUNT | fstab syntax | /host/path container/path nullfs ro 0 0 |
+---------------+---------------------+-----------------------------------------+
| OVERLAY | path(s) | etc root usr (one per line) |
+---------------+---------------------+-----------------------------------------+
| PKG | port/pkg name(s) | vim-console zsh git-lite tree htop |
+---------------+---------------------+-----------------------------------------+
| RDR | tcp port port | tcp 2200 22 (hostport jailport) |
+---------------+---------------------+-----------------------------------------+
| RENDER | /path/file.txt | /usr/local/etc/gitea/conf/app.ini |
+---------------+---------------------+-----------------------------------------+
| RESTART | | (restart jail) |
+---------------+---------------------+-----------------------------------------+
| SERVICE | service command | 'nginx start' OR 'postfix reload' |
+---------------+---------------------+-----------------------------------------+
| SYSRC | sysrc command(s) | nginx_enable=YES |
+---------------+---------------------+-----------------------------------------+
2025-02-16 17:44:47 -07:00
Template Hook Descriptions
--------------------------
ARG - set an ARG value to be used in the template
2025-02-16 17:47:58 -07:00
ARGS will default to the value set inside the template, but can be changed by
including ``--arg ARG=VALUE`` when running the template. Multiple ARGS can also
be specified as seen below. If no ARG value is given, the ``template`` command
2025-04-10 06:53:03 -06:00
will exit.
2025-02-20 12:47:20 -07:00
.. code-block:: shell
ishmael ~ # bastille template azkaban sample/template --arg ARG=VALUE --arg ARG1=VALUE
2025-04-02 23:53:41 -06:00
CMD - run the specified command
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
CONFIG - set the specified property and value
2025-02-16 17:47:58 -07:00
2025-04-21 16:52:13 -06:00
CP/OVERLAY - copy specified files from template directory to specified path inside jail
2025-02-16 17:47:58 -07:00
INCLUDE - specify a template to include. Make sure the template is
2025-04-21 16:52:13 -06:00
bootstrapped, or you are using the template url
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
LIMITS - set the specified resource value for the jail
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
LINE_IN_FILE - add specified word to specified file if not present
2025-04-02 23:52:33 -06:00
2025-04-02 23:53:41 -06:00
MOUNT - mount specified files/directories inside the jail
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
PKG - install specified packages inside jail
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
RDR - redirect specified ports to the jail
2025-02-16 17:47:58 -07:00
RENDER - replace ARG values inside specified files inside the jail. If a
2025-04-21 16:52:13 -06:00
directory is specified, ARGS will be replaced in all files underneath
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
RESTART - restart the jail
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
SERVICE - run `service` command inside the jail with specified arguments
2025-02-16 17:47:58 -07:00
2025-04-02 23:53:41 -06:00
SYSRC - run `sysrc` inside the jail with specified arguments
2018-11-24 20:07:20 -07:00
Special Hook Cases
------------------
2025-01-15 11:45:30 -07:00
SYSRC requires that NO quotes be used or that quotes (``"``) be escaped ie;
(``\\"``)
2018-11-24 20:07:20 -07:00
ARG will always treat an ampersand "\``&``" literally, without the need to
escape it. Escaping it will cause errors.
2025-01-15 11:45:30 -07:00
2025-04-21 16:46:43 -07:00
Bootstrapping Templates
-----------------------
2025-04-21 18:51:42 -06:00
The official templates for Bastille are all on Gthub, and mirror the directory
structure of the ports tree. So, ``nginx`` is in the ``www`` directory in the
templates, just like it is in the FreeBSD ports tree. To bootstrap the
entire set of official predefined templates run the following command:
2025-04-21 16:46:43 -07:00
.. code-block:: shell
bastille bootstrap https://github.com/bastillebsd/templates
2025-04-21 18:51:42 -06:00
This will install all official templates into the templates directory at
``/usr/local/bastille/templates``. You can then use the ``bastille template``
command to apply any of the templates.
2025-04-21 16:46:43 -07:00
2025-04-21 18:51:42 -06:00
.. code-block:: shell
bastille template TARGET www/nginx
Creating Templates
------------------
2025-04-21 16:46:43 -07:00
2025-04-21 18:51:42 -06:00
Templates can be created and placed inside the templates directory in the
``project/template`` format. Alternatively you can run the ``bastille template``
command from a relative path, making sure it is still in the above format.
2025-04-21 16:46:43 -07:00
2025-02-16 17:44:47 -07:00
Template Examples
-----------------
Place these uppercase template hook commands into a ``Bastillefile`` in any
order and automate container setup as needed.
2020-07-13 19:27:23 -06:00
In addition to supporting template hooks, Bastille supports overlaying files
into the container. This is done by placing the files in their full path, using
the template directory as "/".
2018-11-24 20:07:20 -07:00
2025-04-10 06:53:03 -06:00
An example here may help. Think of ``bastille/templates/username/template``, our
example template, as the root of our filesystem overlay. If you create an
2025-04-10 06:53:03 -06:00
``/etc/hosts`` or ``/etc/resolv.conf`` *inside* the template directory, these
2019-11-20 19:16:21 -07:00
can be overlayed into your container.
2018-11-24 20:07:20 -07:00
Note: due to the way FreeBSD segregates user-space, the majority of your
overlayed template files will be in ``/usr/local``. The few general exceptions
are the ``/etc/hosts``, ``/etc/resolv.conf``, and ``/etc/rc.conf.local``.
2018-11-24 20:07:20 -07:00
After populating ``/usr/local`` with custom config files that your container
will use, be sure to include ``/usr`` in the template OVERLAY definition. eg;
2018-11-24 20:07:20 -07:00
.. code-block:: shell
2025-04-10 06:53:03 -06:00
echo "CP /usr /" >> /usr/local/bastille/templates/username/template/Bastillefile
2018-11-24 20:07:20 -07:00
The above example ``/usr`` will include anything under ``/usr`` inside the
template.
You do not need to list individual files. Just include the top-level directory
name. List these top-level directories one per line.
2018-11-24 20:07:20 -07:00
Applying Templates
------------------
2019-11-20 19:16:21 -07:00
Containers must be running to apply templates.
2018-11-24 20:07:20 -07:00
2025-04-10 06:53:03 -06:00
Bastille includes a ``template`` command. This command requires a target and a
2018-11-24 20:07:20 -07:00
template name. As covered in the previous section, template names correspond to
2025-04-10 06:53:03 -06:00
directory names in the ``bastille/templates`` directory.
2018-11-24 20:07:20 -07:00
.. code-block:: shell
2020-07-13 19:27:23 -06:00
ishmael ~ # bastille template ALL username/template
[proxy01]:
2018-11-24 20:07:20 -07:00
Copying files...
Copy complete.
Installing packages.
pkg already bootstrapped at /usr/local/sbin/pkg
vulnxml file up-to-date
0 problem(s) in the installed packages found.
Updating bastillebsd.org repository catalogue...
2018-11-24 20:07:20 -07:00
[cdn] Fetching meta.txz: 100% 560 B 0.6kB/s 00:01
[cdn] Fetching packagesite.txz: 100% 121 KiB 124.3kB/s 00:01
Processing entries: 100%
bastillebsd.org repository update completed. 499 packages processed.
2018-11-24 20:07:20 -07:00
All repositories are up to date.
Checking integrity... done (0 conflicting)
The most recent version of packages are already installed
Updating services.
cron_flags: -J 60 -> -J 60
sendmail_enable: NONE -> NONE
syslogd_flags: -ss -> -ss
Executing final command(s).
chsh: user information updated
Template Complete.
2020-04-14 11:52:29 +02:00
[web01]:
2018-11-24 20:07:20 -07:00
Copying files...
Copy complete.
Installing packages.
pkg already bootstrapped at /usr/local/sbin/pkg
vulnxml file up-to-date
0 problem(s) in the installed packages found.
Updating pkg.bastillebsd.org repository catalogue...
2018-11-24 20:07:20 -07:00
[poudriere] Fetching meta.txz: 100% 560 B 0.6kB/s 00:01
[poudriere] Fetching packagesite.txz: 100% 121 KiB 124.3kB/s 00:01
Processing entries: 100%
pkg.bastillebsd.org repository update completed. 499 packages processed.
Updating bastillebsd.org repository catalogue...
2018-11-24 20:07:20 -07:00
[poudriere] Fetching meta.txz: 100% 560 B 0.6kB/s 00:01
[poudriere] Fetching packagesite.txz: 100% 121 KiB 124.3kB/s 00:01
Processing entries: 100%
bastillebsd.org repository update completed. 499 packages processed.
2018-11-24 20:07:20 -07:00
All repositories are up to date.
Checking integrity... done (0 conflicting)
The most recent version of packages are already installed
Updating services.
cron_flags: -J 60 -> -J 60
sendmail_enable: NONE -> NONE
syslogd_flags: -ss -> -ss
Executing final command(s).
chsh: user information updated
Template Complete.
2023-02-25 00:37:46 -08:00
.. _Bastille Templates: https://gitlab.com/BastilleBSD-Templates
Using Ports in Templates
------------------------
Sometimes when you make a template you need special options for a package, or
you need a newer version than what is in the pkgs. The solution for these
cases, or a case like minecraft server that has NO compiled option, is to use
the ports. A working example of this is the minecraft server template in the
template repo. The main lines needed to use this is first to mount the ports
directory, then compile the port. Below is an example of the minecraft template
where this was used.
.. code-block:: shell
ARG MINECRAFT_MEMX="1024M"
ARG MINECRAFT_MEMS="1024M"
ARG MINECRAFT_ARGS=""
CONFIG set enforce_statfs=1;
CONFIG set allow.mount.fdescfs;
CONFIG set allow.mount.procfs;
RESTART
PKG dialog4ports tmux openjdk17
MOUNT /usr/ports usr/ports nullfs ro 0 0
CP etc /
CP var /
CMD make -C /usr/ports/games/minecraft-server install clean
CP usr /
SYSRC minecraft_enable=YES
SYSRC minecraft_memx=${MINECRAFT_MEMX}
SYSRC minecraft_mems=${MINECRAFT_MEMS}
SYSRC minecraft_args=${MINECRAFT_ARGS}
SERVICE minecraft restart
RDR tcp 25565 25565
The MOUNT line mounts the ports directory, then the CMD make line makes the
port. This can be modified to use any port in the port tree.