首页 > 解决方案 > 为 jinja2 模板值设置空变量

问题描述

我有一个由 Ansible 用来呈现实际配置文件的 Jinja2 模板文件。我的用例是使用相同的模板文件并手动运行它(使用包装 python 脚本),使用系统环境变量并填充模板文件。例如,以下是我的模板

{%- if groups['abc'] is defined -%}
  {#- inventory compatible with smoketest using obsolete cluster cms/sat -#}
  {%- set groupname='abc' -%}
{%- else -%}
  {%- if groups['sat'] is defined -%}
    {#- classic definition in fixed inventory 4.x release -#}
    {%- set groupname='sat' -%}
  {%- else -%}
    {#- first pass definition from 4.x releases -#}
    {%- set groupname='hosts' -%}
  {%- endif -%}
{%- endif -%}

而且,我使用以下代码呈现模板:

#!/usr/bin/python
import jinja2
import os

print os.environ
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "test.j2"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render(env=os.environ)  # this is where to put args to the template renderer

print(outputText)

但是,我首先收到以下错误:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    outputText = template.render(env=os.environ)  # this is where to put args to the template renderer
  File "/Users/karthikjayaraman/Library/Python/2.7/lib/python/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/Users/karthikjayaraman/Library/Python/2.7/lib/python/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "./test.j2", line 9, in top-level template code
    {%- if groups['mdc'] is defined -%}
  File "/Users/karthikjayaraman/Library/Python/2.7/lib/python/site-packages/jinja2/environment.py", line 411, in getitem
    return obj[argument]
jinja2.exceptions.UndefinedError: 'groups' is undefined

在这种情况下,如何在环境变量中将组设置为空值(但定义它),以免遇到未定义的错误。我在 shell 中尝试了以下设置(在运行 python 脚本之前),但仍然出现此错误。

export groups=[]
export groups={}
export groups=()
declare -a groups

编辑 1:我发现一件有趣的事情是,当我设置 export groups={} 时,我在 print os.environ 中看不到该变量。

标签: pythonjinja2

解决方案


在这种情况下,如何将组设置为空值

你在.render这种情况下打电话不正确。您编写的kwargs语法将定义一个dict名为的变量env,其中包含所有环境变量作为子变量。

根据您的问题,您真正想要的是:

outputText = template.render(dict(os.environ.items()))

这会将环境中的所有键提升为顶级jinja2 变量,而不是生活在env.

但是,这只是问题的一半:仅将 a 推Dict[str,str]入 Jinja 并不能使其成为执行您想要的操作Dict[str, Dict[str, str]]所需的内容。groups['abc']

为此,您将不得不更进一步,人为地将环境变量提升为丰富的对象:

# assuming `export groups="{}"`
outputText = template.render({
    k: json.loads(v) if v.startswith('{') else v
    for k, v in os.environ.items()})

推荐阅读