我最近开始使用YAML和jinja2。我很难理解为什么我需要在jinja2模板中引用我的YAML映射的整个结构。
我有以下YAML文件
---
PROVIDERS:
PROV1:
int: ge-0/1/1
ipv4: 10.0.1.1/30
PROV2:
int: ge-0/1/2
ipv4: 10.0.1.2/30
这是我的jinja2模板
{%- for provider in PROVIDERS %}
{{ provider }}
{{ PROVIDERS[provider].int }} <-- why not provider.int
{{ PROVIDERS[provider].ipv4 }} <-- why not provider.ipv4
{%- endfor %}
使用pyyaml进行解析会给出(预期的)输出
PROV2
ge-0/1/2
10.0.1.2/30
PROV1
ge-0/1/1
10.0.1.1/30
但是为什么我必须使用PROVIDERS[provider].int
?provider.int
不起作用。
此外,我想知道是否可以将此作为映射列表而不是嵌套映射:
---
PROVIDERS:
- PROV1:
int: ge-0/1/1
ipv4: 10.0.1.1/30
- PROV2:
int: ge-0/1/2
ipv4: 10.0.1.2/30
我尝试过这样做,但是jinja2模板不再产生所需的输出。
这里有两件事要考虑:
答案1很简单:
您有一个字典,它有一个键为
'PROVIDERS'
的项,并且它的值是一个键为'PROV1'
和'PROV2'
的字典,每个键的值都是另一个字典。这是一个比您需要的嵌套更深的结构(稍后将详细介绍),但是现在我们可以看到您的数据结构,我们可以了解模板的情况。这一行:
迭代
PROVIDERS
的键(根据您的输出,这显然是二级嵌套字典,是顶级字典中键'PROVIDERS'
的值)。由于迭代的是键,因此需要使用这些键获取相关的值:对于您的目的,一个更直接的YAML文档是:
注意,我们已经抛弃了冗余的单项映射,并用映射列表替换了映射的第二级映射。同样,我们可以检查:
以下是模板如何使用此数据结构:
显然,您需要修改向模板提供
PROVIDERS
的代码,因为它现在是由整个YAML文档表示的顶级列表,而不是嵌套在其中的字典。相关问题 更多 >
编程相关推荐