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 中看不到该变量。
解决方案
在这种情况下,如何将组设置为空值
你在.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()})
推荐阅读
- ionic-framework - Firebase 是否适用于具有离线模式的 pwa?
- javascript - 如何在 Angular 6 中处理来自后端的多个异步请求?
- python - 在 windows7 上为 python3 安装 METIS 库
- swift - FirebaseAuth,来自提供商的 JWT 在调用 updateEmailUpdate 之前不包含电子邮件地址
- windows-installer - .msi 文件在“asInvoker”requestedExecutionLevel 中请求管理员权限
- android - Android Emulator 从 Android Studio 启动,但不是从命令行启动
- python - 将数据框中多列的数据分组到摘要视图中
- python - Python中数组中元素的索引
- javascript - 在新选项卡中打开链接并重定向后,内部摄像头旋转了 90°
- sql-server - 了解下面的 SQL 查询