我有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中看不到该变量。
答案 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]]