Is it possible to access a OS environment variable directly from a Jinja2 template?
I believe you can access environment variables like so:
{{ env['XMPP_DOMAIN'] or "localhost" }}
This is from an example in a config file that I saw recently for a Docker deployment of ejabberd.
hosts:
- "{{ env['XMPP_DOMAIN'] or "localhost" }}"
NOTE: You can see the rest of the example in the run file from the Github repo.
As I understand things the heavy lifting is done by this bit of code:
readonly PYTHON_JINJA2="import os;
import sys;
import jinja2;
sys.stdout.write(
jinja2.Template
(sys.stdin.read()
).render(env=os.environ))
"""
And this code is what is used to generate a template file:
cat ${CONFIGTEMPLATE} \
| python -c "${PYTHON_JINJA2}" \
> ${CONFIGFILE}
Following @Renier's pointer about custom filters in the comments, I figured out a possible solution.
Define a custom filter:
def env_override(value, key):
return os.getenv(key, value)
Install the filter in the environment:
env.filters['env_override'] = env_override
Use the filter as follows:
"test" : {{ "default" | env_override('CUSTOM') }}
Where the appropriate environment variable can be set as:
export CUSTOM=some_value
If the environment variable is set the output will be:
"test" : some_value
Otherwise:
"test" : default
The answer in https://stackoverflow.com/a/27984610/1070890 works beautifully but you can still get rid of the useless use of cat and compress it to a single statement:
python -c 'import os
import sys
import jinja2
sys.stdout.write(
jinja2.Template(sys.stdin.read()
).render(env=os.environ))' <$CONFIGTEMPLATE >$CONFIGFILE
P.S.: Stack Overflow does not allow formatted code in comments. Therefore I had to post this as a separate answer instead of commenting on https://stackoverflow.com/a/27984610/1070890.