金贾For Loop的重复线路



我对基础设施即代码的编码和学习很陌生
尝试使用for循环从Jinja文件中的变量YAML文件中提取信息。它正在工作,但它又显示了两次代码,我不知道为什么。

{% for item in underlay[inventory_hostname]['MLAG'] -%}
{% if item == 'Odd' -%}   
neighbor 192.168.255.1 peer group LEAF_Peer
{%- else %}
neighbor 192.168.255.2 peer group LEAF_Peer
{% endif %}
{%- endfor %}

Underlay.yml 中的条目示例

leaf1-DC2:
interfaces:
loopback0: 
ipv4: 10.2.0.11
mask: 32
loopback1: 
ipv4: 10.2.1.11
mask: 32
Ethernet3:
ipv4: 10.2.2.0
mask: 31
Ethernet4: 
ipv4: 10.2.2.2
mask: 31
Ethernet5: 
ipv4: 10.2.2.4
mask: 31
BGP: 
ASN: 65201
spine-peers:
- 10.2.2.1
- 10.2.2.3
- 10.2.2.5
spine-ASN: 65200
MLAG: Odd

结果是:

neighbor 192.168.255.2 peer group LEAF_Peer
neighbor 192.168.255.2 peer group LEAF_Peer
neighbor 192.168.255.2 peer group LEAF_Peer

但应该是:

neighbor 192.168.255.2 peer group LEAF_Peer

我把变量文件放在一个设备上,它只包含一次MLAG的条目,但它仍然会产生两行额外的行,我不明白为什么。

目标是创建一个for循环,该循环查看MLAG,如果是Odd,则生成一条语句,或者Even生成另一条语句。

这是因为字符串在Jinja和Python中都是可迭代对象。

你可以测试这个做:

{% for item in 'Odd' %}
Displaying one line (because of `{{ item }}`)
{% endfor %}

那会给你

Displaying one line (because of `O`)
Displaying one line (because of `d`)
Displaying one line (because of `d`)

你的修复方法很简单,只需放弃for循环,完全:

{% if underlay[inventory_hostname].MLAG == 'Odd' -%}   
neighbor 192.168.255.1 peer group LEAF_Peer
{% else -%}
neighbor 192.168.255.2 peer group LEAF_Peer
{% endif %}

最新更新