es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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}
“`

Tags:  ,

Answer

  1. Avatar for 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 el item que se pasa al filtro sea una cadena (string), pero es un entero (integer). Para solucionar esto, puedes convertir item a una cadena utilizando el filtro string antes de pasarlo a contains:

    - set_fact:
        vlan_info: "{{ vlan_info|d({})|combine({item: info}) }}"
      loop: "{{ vlanlist }}"
      vars:
        info: "{{ output5.msg|
                  selectattr('TRUNKING_VLANS', 'contains', item|string)|
                  list }}"
    
    - debug:
        msg: "{{ vlan_info }}"
    

    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 en TRUNKING_VLANS.

Comments are closed.