Доступ к переменным среды ОС из шаблона Jinja2
можно ли получить доступ к переменной среды ОС непосредственно из шаблона Jinja2?
3 ответов
следуя указателю @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
ответ в https://stackoverflow.com/a/27984610/1070890 работает красиво, но вы все равно можете избавиться от бесполезного использования cat и сжать его до одного утверждения:
python -c 'import os
import sys
import jinja2
sys.stdout.write(
jinja2.Template(sys.stdin.read()
).render(env=os.environ))' <$CONFIGTEMPLATE >$CONFIGFILE
С. П.: переполнение стека не позволяет отформатированный код в комментариях. Поэтому я должен был опубликовать это как отдельный ответ, а не комментировать https://stackoverflow.com/a/27984610/1070890.
Я считаю, что вы можете получить доступ к переменным среды, как так:
{{ env['XMPP_DOMAIN'] or "localhost" }}
это из примера в файле config, который я недавно видел на Докер развертывание ejabberd.
hosts:
- "{{ env['XMPP_DOMAIN'] or "localhost" }}"
Примечание: вы можете увидеть остальную часть примера в выполнить файл из репозитория Github.
как я понимаю, тяжелая работа выполняется этим битом кода:
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}