是否可以直接从Jinja2模板访问OS环境变量?
答案 0 :(得分:8)
按照@ Renier关于评论中自定义过滤器的指针,我找到了一个可能的解决方案。
def env_override(value, key):
return os.getenv(key, value)
在环境中安装过滤器:
env.filters['env_override'] = env_override
按如下方式使用过滤器:
"test" : {{ "default" | env_override('CUSTOM') }}
适当的环境变量可以设置为:
export CUSTOM=some_value
如果设置了环境变量,则输出将为:
"test" : some_value
否则:
"test" : default
答案 1 :(得分:8)
https://stackoverflow.com/a/27984610/1070890中的答案很有效但你仍然可以摆脱对猫的无用使用并将其压缩成一个声明:
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不允许在评论中使用格式化代码。因此,我必须将此作为单独的答案发布,而不是评论https://stackoverflow.com/a/27984610/1070890。
答案 2 :(得分:6)
我相信你可以像这样访问环境变量:
{{ env['XMPP_DOMAIN'] or "localhost" }}
这是我最近看到的Docker deployment of ejabberd配置文件中的一个示例。
hosts:
- "{{ env['XMPP_DOMAIN'] or "localhost" }}"
注意:您可以在Github存储库的run文件中看到该示例的其余部分。
据我所知,重要的事情是通过这段代码完成的:
readonly PYTHON_JINJA2="import os;
import sys;
import jinja2;
sys.stdout.write(
jinja2.Template
(sys.stdin.read()
).render(env=os.environ))
"""
此代码用于生成模板文件:
cat ${CONFIGTEMPLATE} \
| python -c "${PYTHON_JINJA2}" \
> ${CONFIGFILE}