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
|
|
|
|
2025-04-20 11:19:18 -05: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
|
|
|
|
2025-04-20 11:19:18 -05: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
|
|
|
|
|
--------------------------
|
|
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``ARG`` - set an ARG value to be used in the template
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
ARGS will default to the value set inside the template, but can be changed by
|
2025-05-21 18:26:32 -06:00
|
|
|
including ``--arg ARG=VALUE`` when running the template.
|
|
|
|
|
|
2025-07-08 22:40:28 -05:00
|
|
|
Multiple ARGS can also be specified as seen below. If no ARG value is given,
|
|
|
|
|
Bastille will show a warning, but continue on with the rest of the template.
|
2025-02-20 12:47:20 -07:00
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
|
|
ishmael ~ # bastille template azkaban sample/template --arg ARG=VALUE --arg ARG1=VALUE
|
|
|
|
|
|
2025-07-08 22:40:28 -05:00
|
|
|
The ``ARG`` hook has a wide range of functionality, including passing KEY=VALUE
|
|
|
|
|
pairs to any templates called with the ``INCLUDE`` hook. See the following example...
|
2025-05-21 18:26:32 -06:00
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
|
|
ARG JAIL
|
|
|
|
|
ARG IP
|
|
|
|
|
|
|
|
|
|
INCLUDE other/template --arg JAIL=${JAIL} --arg IP=${IP}
|
|
|
|
|
|
2025-07-08 22:40:28 -05:00
|
|
|
If the above template is called with ``--arg JAIL=myjail --arg IP=10.3.3.3``,
|
|
|
|
|
these values will be passed along to ``other/template`` as well, with the
|
|
|
|
|
matching variable. So ``${JAIL}`` will be ``myjail`` and ``${IP}`` will be
|
|
|
|
|
``10.3.3.3``.
|
2025-05-21 18:26:32 -06:00
|
|
|
|
2025-07-08 22:40:28 -05:00
|
|
|
The ARG hook has three values that are built in, and will differ for every jail.
|
|
|
|
|
The values are ``JAIL_NAME``, ``JAIL_IP``, and ``JAIL_IP6``. These can be used
|
|
|
|
|
inside any template without setting the values at the top of the Bastillefile.
|
|
|
|
|
The values are automatically retrieved from the targeted jails configuration.
|
2025-02-20 12:47:20 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``CMD`` - run the specified command
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``CONFIG`` - set the specified property and value
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``CP/OVERLAY`` - copy specified files from template directory to specified path inside jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06: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-05-21 18:26:32 -06:00
|
|
|
``LIMITS`` - set the specified resource value for the jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``LINE_IN_FILE`` - add specified word to specified file if not present
|
2025-04-02 23:52:33 -06:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``MOUNT`` - mount specified files/directories inside the jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``PKG`` - install specified packages inside jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``RDR`` - redirect specified ports to the jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06: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-05-21 18:26:32 -06:00
|
|
|
``RESTART`` - restart the jail
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``SERVICE`` - run `service` command inside the jail with specified arguments
|
2025-02-16 17:47:58 -07:00
|
|
|
|
2025-05-21 18:26:32 -06:00
|
|
|
``SYSRC`` - run `sysrc` inside the jail with specified arguments
|
2018-11-24 20:07:20 -07:00
|
|
|
|
2025-01-15 12:09:55 -07:00
|
|
|
Special Hook Cases
|
|
|
|
|
------------------
|
2025-01-15 11:45:30 -07:00
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
SYSRC requires that NO quotes be used or that quotes (``"``) be escaped ie;
|
|
|
|
|
(``\\"``)
|
2018-11-24 20:07:20 -07:00
|
|
|
|
2025-04-20 11:19:18 -05: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-09-23 18:51:04 +02:00
|
|
|
The official templates for Bastille are all on Gthub, and mirror the directory
|
2025-04-21 18:51:42 -06:00
|
|
|
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-09-23 18:51:04 +02:00
|
|
|
|
2025-02-16 17:44:47 -07:00
|
|
|
Template Examples
|
|
|
|
|
-----------------
|
|
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
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
|
|
|
|
2025-04-20 11:19:18 -05: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
|
2019-11-20 18:54:05 -07:00
|
|
|
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
|
2025-04-20 11:19:18 -05:00
|
|
|
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
|
|
|
|
2025-04-20 11:19:18 -05: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
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
The above example ``/usr`` will include anything under ``/usr`` inside the
|
|
|
|
|
template.
|
2020-01-26 12:43:45 -07:00
|
|
|
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
|
2019-11-20 18:54:05 -07:00
|
|
|
[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.
|
2019-11-20 18:54:05 -07:00
|
|
|
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%
|
2019-11-20 18:54:05 -07:00
|
|
|
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
|
|
|
|
2019-11-20 18:54:05 -07: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.
|
2019-11-20 18:54:05 -07:00
|
|
|
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%
|
2019-11-20 18:54:05 -07:00
|
|
|
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%
|
2019-11-20 18:54:05 -07:00
|
|
|
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
|
|
|
|
2025-08-20 10:40:24 -05:00
|
|
|
.. _Bastille Templates: https://github.com/BastilleBSD/templates
|
2023-10-26 16:36:32 -07:00
|
|
|
|
|
|
|
|
Using Ports in Templates
|
|
|
|
|
------------------------
|
|
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
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.
|
2023-10-26 16:36:32 -07:00
|
|
|
|
|
|
|
|
.. 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
|
|
|
|
|
|
2025-04-20 11:19:18 -05:00
|
|
|
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.
|