Render jinja2 templates on the command line using shell environment variables
Project description
envtpl
Render jinja2 templates on the command line with shell environment variables
Installation
pip install envtpl
How-to
Say you have a configuration file called whatever.conf that looks like this
foo = 123
bar = "abc"
You can use envtpl to set foo
and bar
from the command line by creating a file called whatever.conf.tpl
foo = {{ FOO }}
bar = "{{ BAR }}"
If you run
FOO=123 BAR=abc envtpl < whatever.conf.tpl > whatever.conf
you'll get back the original whatever.conf.
You can also specify default values
foo = {{ FOO | default(123) }}
bar = "{{ BAR | default("abc") }}"
Running
FOO=456 envtpl < whatever.conf.tpl > whatever.conf
will generate
foo = 456
bar = "abc"
This is all standard Jinja2 syntax, so you can do things like
{% if BAZ is defined %}
foo = 123
{% else %}
foo = 456
{% endif %}
bar = "abc"
If an environment variable is missing, envtpl will throw an error
$ echo '{{ FOO }} {{ BAR }}' | FOO=123 envtpl
Error: 'BAR' is undefined
You can change this behaviour to insert empty strings instead by passing the --allow-missing
flag.
Instead of reading from stdin and writing to stdout, you can pass the input filename as an optional positional argument,
and set the output filename with the --output-file
(-o
) argument.
envtpl -o whatever.conf whatever.conf.tpl
As a convenience, if you don't specify an output filename and the input filename ends with .tpl
, the output filename will be the input filename without the .tpl
extension, i.e.
envtpl whatever.conf.tpl
# is equivalent to
envtpl -o whatever.conf whatever.conf.tpl
By default, envtpl will delete the input template file. You can keep it by passing the --keep-template
flag.
There's a special environment(prefix='')
function that you can use as a kind of wildcard variable. If you have hello.tpl
hello = {{ FOO }}
{% for key, value in environment('MY_') %}{{ key }} = {{ value }}
{% endfor %}
and compile it using
FOO=world MY_baz=qux MY_foo=bar envtpl hello.tpl
You end up with
hello = world
baz = qux
foo = bar
What's the point?
I use this script quite a lot in Docker images. Usually I'll have the CMD execute some file, like /bin/start_container, that sets up the runtime configuration for the container by inserting environment variables into config files before starting the main process. A redis example could look like this
#!/bin/bash
# start_container
envtpl /etc/redis.conf.tpl
redis-server
This is the use case I've optimised for, so that's why envtpl by default will delete the original template file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file envtpl-0.7.0.tar.gz
.
File metadata
- Download URL: envtpl-0.7.0.tar.gz
- Upload date:
- Size: 4.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.9.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bec46346d245f110af25fc9a763d3eecab21267d0f12eb5a2b3d7a28914bf01a |
|
MD5 | ea45b10e214a67889837245146efa7a4 |
|
BLAKE2b-256 | 7a9b57a698c6d73245efe10acd3521876dc4757c372493d75d854b58b593b5df |
File details
Details for the file envtpl-0.7.0-py3-none-any.whl
.
File metadata
- Download URL: envtpl-0.7.0-py3-none-any.whl
- Upload date:
- Size: 4.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.0 CPython/3.9.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cfc5bec6c554fa2b1578980f4c2931dd0db128f14f5a7f4c91c3280167e30cf9 |
|
MD5 | 898aadc32a169d4c52e994920ee62d05 |
|
BLAKE2b-256 | 8c6f9892beee37e9f67f936f901c580eb98755d164f05ae81a642716f9830ae3 |