为jinja2模板值设置空变量

时间:2018-08-27 22:43:13

标签: python 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中看不到该变量。

1 个答案:

答案 0 :(得分:0)

  

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

在这种情况下,您给language的呼叫不正确。您所编写的.render语法将定义一个名为kwargs的{​​{1}}变量,其中包含所有环境变量作为子变量。

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

dict

会将环境中的所有键升级为顶层 jinja2变量,而不是将它们置于env下。

但是,这只是问题的一半:仅将outputText = template.render(dict(os.environ.items())) 推入Jinja并不会使其进入env,这是Dict[str,str]要做您想要的事情所需要的。

为此,您将需要更进一步,将环境变量人为地升级为丰富的对象:

Dict[str, Dict[str, str]]