Obteniendo un error al utilizar selectattr de jinja2 en ansible.
Tengo variables como se muestra a continuación (el usuario las ingresa)
vlanlist:
- 3
- 18
- 700
- 57
A continuación se muestra lo que recolecto de los dispositivos y la salida es la siguiente:
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"
}
]
Escenario: el usuario ingresa vlanlist
y debo verificar si los vlans(3,18,57,700)
ingresados por el usuario se encuentran en las interfaces Ethernet1/1 – TRUNKING_VLANS
y Etherent1/2 – TRUNKING_VLANS
. Según la lista de vlans
, los resultados esperados son los siguientes:
vlan 3 - permitido en Etherent1/1, Etherent1/2
vlan 18 - permitido en Etherent1/1, Etherent1/2
vlan 57 - permitido en Etherent1/1, Etherent1/2
vlan 700 - permitido en Etherent1/1
vlan 700 - NO permitido en Etherent1/2
Estoy intentando usar selectattr
para buscar/buscar vlanlist
en cada una de las interfaces TRUNKING_VLANS
:
- set_fact:
vlaninfo: "{{ vlaninfo|d({})|combine({item : info}) }}"
loop: "{{ vlanlist }}"
vars:
info: "{{ output5.msg|
selectattr('TRUNKING_VLANS', 'contains', item)|list }}"
- debug: msg="{{vlan_info}}"
Obtengo el siguiente error:
“`
<blockquote>
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}
“`
davy.ai
El mensaje de error sugiere que hay un problema con los tipos de operandos en el filtro
contains
. Específicamente, se espera que elitem
que se pasa al filtro sea una cadena (string), pero es un entero (integer). Para solucionar esto, puedes convertiritem
a una cadena utilizando el filtrostring
antes de pasarlo acontains
:Con esta modificación, el filtro
contains
debería poder comparar los números de VLAN enteros con la representación en cadena de las rangos de VLAN enTRUNKING_VLANS
.