我有一个带有 ip、vrf 等属性的接口列表。对我来说最有趣的属性是 vrf。我使用地图属性来过滤此列表,并使用减少的唯一列表创建必要的代码。如果提供的接口之一没有定义 VRF,过滤此列表的最优雅的方法是什么?
变量
base:
HOSTNAME: MVPS001R01
SITE_NUMBER: 20
ROUTER_NUMBER: 1
MGMT_IP: 100.64.1.1
interfaces:
- intf: LOOP0
ip: 100.64.1.1
vrf: MPLS1
type: LOOP
- intf: GI0/0/0
vrf: global
ip: 192.168.0.1/24
type: eth
peering:
- intf: GI0/0/1
vrf: INET1
ip: 1.1.1.1/30
type: eth
- intf: GI0/1/0
vrf: MPLS1
ip: 172.31.0.45
vlan: 2010
type: eth
Run Code Online (Sandbox Code Playgroud)
Jinja2代码:
{% set VRFS = base.interfaces | map(attribute='vrf') | list | unique %}
{% for transport in transports %}
{% for vrf in VRFS %}
{% if transport.name | upper == vrf | upper %}
vrf definition {{ transport.name | upper }}
rd 1:{{ transport.priority | int }}
!
address-family ipv4
exit-address-family
!
{% endif %}
{% endfor %}
{% endfor%}
Run Code Online (Sandbox Code Playgroud)
输出 当所有接口都定义了“vrf”时
vrf definition MPLS1
rd 1:100
!
address-family ipv4
exit-address-family
!
vrf definition INET1
rd 1:200
!
address-family ipv4
exit-address-family
Run Code Online (Sandbox Code Playgroud)
当接口之一缺少 VRF 时的输出
interfaces:
- intf: LOOP0
ip: 100.64.1.1
vrf: MPLS1
type: LOOP
- intf: GI0/0/0
ip: 192.168.0.1/24
type: eth
peering:
TASK [deploy-smartwan : Generate Base Configuration File] *******************************************************************************************
fatal: [router1]: FAILED! => {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'vrf'"}
Run Code Online (Sandbox Code Playgroud)
可能是没有设置vrf属性。我该如何解释并有效地处理这个问题?
通过添加 selectattr 过滤器,我能够仅从定义了 vrf 属性的 base.interfaces 中选择项目。我相信这是一种非常优雅的方法,可以将元素列表减少到生成配置所需的数量。
{% set VRFS = base.interfaces | selectattr("vrf", "defined") | map(attribute='vrf') | list | unique %}
{% for transport in transports %}
{% for vrf in VRFS %}
{% if transport.name | upper == vrf | upper %}
vrf definition {{ transport.name | upper }}
rd 1:{{ transport.priority | int }}
!
address-family ipv4
exit-address-family
!
{% endif %}
{% endfor %}
{% endfor%}
Run Code Online (Sandbox Code Playgroud)
变量
我有一个带有 ip、vrf 等属性的接口列表。对我来说最有趣的属性是 vrf。我使用地图属性来过滤此列表,并使用减少的唯一列表创建必要的代码。如果提供的接口之一没有定义 VRF,过滤此列表的最优雅的方法是什么?
变量
base:
HOSTNAME: MVPS001R01
SITE_NUMBER: 20
ROUTER_NUMBER: 1
MGMT_IP: 100.64.1.1
interfaces:
- intf: LOOP0
ip: 100.64.1.1
vrf: MPLS1
type: LOOP
- intf: GI0/0/0
ip: 192.168.0.1/24
type: eth
peering:
- intf: GI0/0/1
vrf: INET1
ip: 1.1.1.1/30
type: eth
- intf: GI0/1/0
vrf: MPLS1
ip: 172.31.0.45
vlan: 2010
type: eth
Run Code Online (Sandbox Code Playgroud)
输出
vrf definition MPLS1
rd 1:100
!
address-family ipv4
exit-address-family
!
vrf definition INET1
rd 1:200
!
address-family ipv4
exit-address-family
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2528 次 |
| 最近记录: |