j2cli
is a command-line tool for templating in shell-scripts,
leveraging the Jinja2 library.
Features:
- Jinja2 templating
- INI, YAML, JSON data sources supported
- Allows the use of environment variables in templates! Hello Docker :)
Inspired by mattrobenolt/jinja2-cli
pip install j2cli
To enable the YAML support with pyyaml:
pip install j2cli[yaml]
Suppose, you want to have an nginx configuration file template, nginx.j2
:
server {
listen 80;
server_name {{ nginx.hostname }};
root {{ nginx.webroot }};
index index.htm;
}
And you have a JSON file with the data, nginx.json
:
{
"nginx":{
"hostname": "localhost",
"webroot": "/var/www/project"
}
}
This is how you render it into a working configuration file:
$ j2 -f json nginx.j2 nginx.json > nginx.conf
The output is saved to nginx.conf
:
server {
listen 80;
server_name localhost;
root /var/www/project;
index index.htm;
}
Alternatively, you can use the -o nginx.conf
option.
Suppose, you have a very simple template, person.xml
:
<data><name>{{ name }}</name><age>{{ age }}</age></data>
What is the easiest way to use j2 here? Use environment variables in your bash script:
$ export name=Andrew
$ export age=31
$ j2 /tmp/person.xml
<data><name>Andrew</name><age>31</age></data>
Compile a template using INI-file data source:
$ j2 config.j2 data.ini
Compile using JSON data source:
$ j2 config.j2 data.json
Compile using YAML data source (requires PyYAML):
$ j2 config.j2 data.yaml
Compile using JSON data on stdin:
$ curl http://example.com/service.json | j2 --format=json config.j2
Compile using environment variables (hello Docker!):
$ j2 config.j2
Or even read environment variables from a file:
$ j2 --format=env config.j2 data.env
j2
accepts the following arguments:
template
: Jinja2 template file to renderdata
: (optional) path to the data used for rendering. The default is-
: use stdin
Options:
-
--format, -f
: format for the data file. The default is?
: guess from file extension. -
--import-env VAR, -e EVAR
: import all environment variables into the template asVAR
. To import environment variables into the global scope, give it an empty string:--import-env=
. (This will overwrite any existing variables!) -
-o outfile
: Write rendered template to a file -
--undefined
: Allow undefined variables to be used in templates (no error will be raised) -
--filters filters.py
: Load custom Jinja2 filters and tests from a Python file. Will load all top-level functions and register them as filters. This option can be used multiple times to import several files. -
--tests tests.py
: Load custom Jinja2 filters and tests from a Python file.
There is some special behavior with environment variables:
- When
data
is not provided (data is-
),--format
defaults toenv
and thus reads environment variables - When
--format=env
, it can read a special "environment variables" file made like this:env > /tmp/file.env
Data input from environment variables.
Render directly from the current environment variable values:
$ j2 config.j2
Or alternatively, read the values from a file:
NGINX_HOSTNAME=localhost
NGINX_WEBROOT=/var/www/project
NGINX_LOGS=/var/log/nginx/
And render with:
$ j2 config.j2 data.env
$ env | j2 --format=env config.j2.
This is especially useful with Docker to link containers together.
INI data input format.
data.ini:
[nginx]
hostname=localhost
webroot=/var/www/project
logs=/var/log/nginx/
Usage:
$ j2 config.j2 data.ini
$ cat data.ini | j2 --format=ini config.j2
JSON data input format
data.json:
{
"nginx":{
"hostname": "localhost",
"webroot": "/var/www/project",
"logs": "/var/log/nginx/"
}
}
Usage:
$ j2 config.j2 data.json
$ cat data.json | j2 --format=ini config.j2
YAML data input format.
data.yaml:
nginx:
hostname: localhost
webroot: /var/www/project
logs: /var/log/nginx
Usage:
$ j2 config.j2 data.yml
$ cat data.yml | j2 --format=yaml config.j2
Given a Docker Link environment variable value, format it into something else.
This first parses a Docker Link value like this:
DB_PORT=tcp://172.17.0.5:5432
Into a dict:
{
'proto': 'tcp',
'addr': '172.17.0.5',
'port': '5432'
}
And then uses format
to format it, where the default format is '{addr}:{port}'.
More info here: Docker Links