【发布时间】:2022-01-22 19:25:01
【问题描述】:
我有如下变量,(用户输入这些)
vlanlist:
- 3
- 18
- 700
- 57
以下是我从设备收集的内容,输出如下:
output5.msg:
[
{
"INTERFACE": "Ethernet1/1",
"TRUNKING_VLANS": "2-18,20,24,48,52,54,56-66,68,70,72,76,80-82,84,86,88,90,92-94,96-104,108,112,116-127,700"
},
{
"INTERFACE": "Ethernet1/2",
"TRUNKING_VLANS": "2-18,20,24,48,52,54,56-66,68,70,72,76,80-82,84,86,88,90,92-94,96-104,108,112,116-127"
}
]
场景:用户输入vlanlist,我必须根据vlans下面的列表是预期的结果:
vlan 3 - allowed on Etherent1/1,Etherent1/2
vlan 18 - allowed on Etherent1/1,Etherent1/2
vlan 57 - allowed on Etherent1/1,Etherent1/2
vlan 700 - allowed on Etherent1/1
vlan 700 - NOT allowed on Etherent1/2
我正在尝试使用selectattr 查找/查找vlanlist 在每个接口TRUNKING_VLANS 中:
- set_fact:
vlan_info: "{{ vlan_info|d({})|combine({item : info}) }}"
loop: "{{ vlanlist }}"
vars:
info: "{{ output5.msg|
selectattr('TRUNKING_VLANS', 'contains', item)|list }}"
- debug: msg="{{vlan_info}}"
得到错误:
{"msg": "An unhandled exception occurred while templating '{{ output5.msg| selectattr('TRUNKING_VLANS', 'contains', item)|list }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: Unexpected templating type error occurred on ({{ output5.msg| selectattr('TRUNKING_VLANS', 'contains', item)|list }}): 'in <string>' requires string as left operand, not int"}
【问题讨论】:
-
TRUNKING_VLANS不是列表,因此您不能在其上使用简单的contains。然后,错误消息是不言自明的,包含可以比较字符串,但vlans包含int。您应该将它们转换为string -
另外请注意,您的
contains不会匹配3,因为它在TRUNKING_VLANS中定义为范围2-18。 -
@β.εηοιτ.βε 你能分享任何示例或帖子,我可以参考和修复我的代码,尝试谷歌搜索一段时间找不到,谢谢
-
修复您的错误消息就像
{{ output5.msg | selectattr('TRUNKING_VLANS', 'contains', item | string) | list }}一样简单。但这并不能满足您的需求,因为您的需求并不像您想象的那么微不足道。