我有一个YAML文件,它有两个字典的默认值,定义如下:
sample:
high:
name: high-volume
alias: hi-vl
hi-vl:
ab1:
add:
range: 0
range1: 0
remove:
range: -1
range1: -1为了迭代并从jinja2模板中获取值,我使用以下代码:
{% for key, value in sample.iteritems() %}
{% set al = value.alias %}
{% for key1, value1 in al.iteritems() %}当我执行这个模板来生成YAML文件时,我得到了错误:
"msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'iteritems'"}set变量正在将变量更改为unicode。如果我在set语句中用直接的value代替value.alias,那么迭代就能正常工作。
我试过使用像to_yaml,tojson这样的过滤器,但它们会转换成字符串,而不是呈现为dict。
发布于 2019-02-02 04:09:30
您可以使用Python将yaml转换为dict,创建jinja字符串,将jinja字符串加载到Template类中并呈现它:
假设yaml存储在一个名为specs.yaml的文件中。我们将首先打开它并将其转换为字典:
import yaml
import json
from jinja2 import Template
with open('specs.yaml') as f:
specs = f.read()
specs_dict = yaml.load(specs) #get dict from yaml
print(json.dumps(test, indent=4)) #print pretty dict tree
#Output:
{
"sample": {
"high": {
"name": "high-volume",
"alias": "hi-vl"
}
},
"hi-vl": {
"ab1": {
"add": {
"range": 0,
"range1": 0
},
"remove": {
"range": -1,
"range1": -1
}
}
}
}现在,我们可以定义jinja字符串并创建一个模板对象来呈现它。
#form jinja string
jinja_string = """{% for key, value in specs_dict['sample'].items() %}
{% set al = value['alias'] %}
{% for key, value in specs_dict[al].items() %}
{{key}}:{{value}}
{% endfor %}
{% endfor %}"""
# create template object and render it
template = Template(jinja_string)
print(template.render(specs_dict=specs_dict))
#Output:
ab1:{'add': {'range': 0, 'range1': 0}, 'remove': {'range': -1, 'range1':-1}}https://stackoverflow.com/questions/54307764
复制相似问题