j2subst is a command-line tool for processing Jinja2 templates with configuration data from multiple sources. It's designed for use in CI/CD pipelines and configuration management workflows.
- Multiple configuration formats: Supports YAML, JSON, and TOML configuration files
- Flexible template resolution: Automatic template path resolution with placeholders
- Environment variables: Access to environment variables within templates
- Python module integration: Import Python modules for advanced template logic
- Built-in functions & filters: Comprehensive set of built-in Jinja2 filters and functions
- CI/CD aware: Special behavior for CI/CD environments
- Dump mode: Export configuration data for debugging and inspection
docker pull docker.io/rockdrilla/j2substpip install j2substDocker image docker.io/rockdrilla/j2subst has several extra things done:
- entrypoint is set to
j2substscript; - current working directory is set to "
/w" and it's volume. - environment variable
J2SUBST_PYTHON_MODULESis set to"netaddr psutil"- these packages are installed viapipand they are not dependencies in any kind, but provided for better usability; see filedocker/requirements-extra.txt.
To simplify usage, the one may define shell alias:
alias j2subst='docker run --rm -v "${PWD}:/w" docker.io/rockdrilla/j2subst 'Process a single template file:
j2subst template.j2This will process template.j2 and output to template (removing the .j2 extension).
Process template with explicit input and output:
j2subst input.j2 output.txtUse stdin/stdout:
cat template.j2 | j2subst - > output.txt
j2subst input.j2 -Process all templates in a directory (no recursion):
j2subst /path/to/templates/Control recursion depth:
j2subst --depth 3 /path/to/templates/j2subst can load configuration from multiple sources:
j2subst -c config.yml template.j2
j2subst -c /path/to/configs/ template.j2Supported formats:
- YAML (
.yaml,.yml) - JSON (
.json) - TOML (
.toml)
Specify template search paths:
j2subst -t /custom/templates:/other/templates template.j2Default template path is "@{ORIGIN}:@{CWD}".
Template path placeholders:
@{CWD}- current working directory@{ORIGIN}- directory containing the currently processed template file. This placeholder dynamically updates when processing multiple templates, always pointing to the directory of the template currently being rendered.
Nota bene: @{ORIGIN} is unavailable when processing template from stdin.
Templates have access to two main dictionaries:
{{ cfg }}- Configuration data from files{{ env }}- Environment variables
# config.j2
server_name: {{ cfg.server.name }}
database_url: {{ cfg.database.url }}
environment: {{ env.ENVIRONMENT }}With configuration file config.yml:
server:
name: myserver
database:
url: postgresql://localhost/mydbAlong with dictionaries above, the following variables are available:
{{ is_ci }}-Trueif running in CI/CD environment,Falseotherwise{{ j2subst_file }}- path to the currently processed template{{ j2subst_origin }}- directory of the currently processed template
Nota bene: j2subst_file and j2subst_origin are set to None when processing template from stdin.
Example:
{% if is_ci %}
Running in CI environment
{% endif %}
{%- if j2subst_origin %}
{#- accessing files "near" template file -#}
{%- endif %}--verbose, -v- Increase verbosity (can be used multiple times)--quiet, -q- Enable quiet mode (overrides "--verbose")--debug, -D- Enable debug mode (prints debug messages to stderr; overrides "--quiet")--strict, -s- Enable strict mode (warnings become errors)--force, -f- Enable force mode (overwrite existing files)--unlink, -u- Delete template files after processing
--config-path, -c PATH- Colon-separated list of config files/directories--template-path, -t PATH- Colon-separated list of template directories--depth, -d INTEGER- Set recursion depth for directory processing (1-20)
-
--dump [FORMAT]- Dump configuration to stdout (YAML/JSON) and exit -
--python-modules LIST- Space-separated list of Python modules to import -
--dict-name-cfg NAME- Custom name for configuration dictionary -
--dict-name-env NAME- Custom name for environment dictionary
--help-cicd- Show help for CI/CD behavior--help-click- Show help for Click behavior--help-dump- Show help for dump mode--help-env- Show help for environment variables--help-template-path- Show help for template paths
Corresponding environment variables are also supported:
|------------------------+------------------+---------|
| Environment variable | Flag option | Type |
|------------------------+------------------+---------|
| J2SUBST_VERBOSE | --verbose | integer |
| J2SUBST_QUIET | --quiet | flag |
| J2SUBST_DEBUG | --debug | flag |
| J2SUBST_STRICT | --strict | flag |
| J2SUBST_FORCE | --force | flag |
| J2SUBST_UNLINK | --unlink | flag |
| J2SUBST_DEPTH | --depth | integer |
| J2SUBST_CONFIG_PATH | --config-path | string |
| J2SUBST_TEMPLATE_PATH | --template-path | string |
| J2SUBST_PYTHON_MODULES | --python-modules | string |
| J2SUBST_DICT_NAME_CFG | --dict-name-cfg | string |
| J2SUBST_DICT_NAME_ENV | --dict-name-env | string |
|------------------------+------------------+---------|
See Click documentation for more details about how Click handles environment variables, especially for flag options.
- option
--depth/ variableJ2SUBST_DEPTHdefaults to20if running in CI/CD and1otherwise. - if argument list is empty then it set to current working directory.
The following Python modules are available by default in templates:
datetimehashlibos_path(alias foros.path)pathlibresecretsstring
Available built-in functions:
bool,filter,isinstance,len,list,repr,set,sorted,str,type
Reference: Built-in Functions
Along with default Jinja2 filters, J2subst provides extra filters, see dedicated documentation here.
Direct link to GitHub: doc/filters.md
j2subst --dump
j2subst --dump json
j2subst -c config.yml --dumpj2subst --python-modules "myjson:json math" template.j2This imports:
jsonmodule asmyjsonmathmodule asmath
j2subst --dict-name-cfg config --dict-name-env environment template.j2Now use in templates:
{{ config.server.name }}
{{ environment.HOME }}export IMAGE_VERSION=wip
./docker/build-scripts/image-base.sh
./docker/build-scripts/image.shApache-2.0