Доступ к переменным среды ОС из шаблона 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}

ссылки