在YAML中存储多个网络设备并在jinja2中引用

在YAML中存储多个网络设备并在jinja2中引用,yaml,jinja2,Yaml,Jinja2,如何构造一个yaml文件来保存多个网络设备,并从jinja2文件中引用特定的供应商/类型 例如: — ip: 10.10.10.10 hostname: core-fw-domain-location username: admin password: password vendor: cisco type: firewall ip: 20.20.20.20 hostname: core-rt-domain-location username: admin password: password

如何构造一个yaml文件来保存多个网络设备,并从jinja2文件中引用特定的供应商/类型

例如:

—
ip: 10.10.10.10
hostname: core-fw-domain-location
username: admin
password: password
vendor: cisco
type: firewall
ip: 20.20.20.20
hostname: core-rt-domain-location
username: admin
password: password
vendor: cisco
type: router
{% if node.hostname == 'core-fw-domain-location' %}
enable secret {{ node.secret }}
username admin privilege password {{ node.secret }}
{% endif %}
显然,上述方法不起作用-我如何构建它,使其具有层次性

在我的jinja2文件中,如何引用它

例如:

—
ip: 10.10.10.10
hostname: core-fw-domain-location
username: admin
password: password
vendor: cisco
type: firewall
ip: 20.20.20.20
hostname: core-rt-domain-location
username: admin
password: password
vendor: cisco
type: router
{% if node.hostname == 'core-fw-domain-location' %}
enable secret {{ node.secret }}
username admin privilege password {{ node.secret }}
{% endif %}

将YAML结构为地图列表:

- ip: 10.10.10.10
  hostname: core-fw-domain-location
  username: admin
  password: password
  vendor: cisco
  type: firewall
- ip: 20.20.20.20
  hostname: core-rt-domain-location
  username: admin
  password: password
  vendor: cisco
  type: router
然后在python代码中,在渲染模板时将
节点更改为
节点
,因为现在配置了多个节点:

config = baseline.render(nodes = node_object)
在jinja2文件中,相应地循环通过
节点

{% for node in nodes -%}
{% if node.hostname == 'core-fw-domain-location' %}
enable secret {{ node.password }}
username admin privilege password {{ node.password }}
{% endif %}
{%- endfor %}

我懂了。我忘了你现在需要循环通过节点,因为它现在不仅仅是一个。我已经相应地编辑了我的答案。非常感谢!!成功了!为什么需要将连字符放在for循环-%}的末尾和endfor{%-]的开头?为了确认,它将列表中的每个元素都视为一个“节点”,对吗?很高兴能提供帮助。是的,它循环遍历
节点
中的每个项目,并将该项目分配给
节点
,在本例中,这是一个dict。jinja标记结尾之前或开始之后的连字符意味着在该方向删除所有空格和换行符,这样就不会插入不必要的空行在渲染的输出中添加。