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.

Cómo obtener el formato de clave-valor de un diccionario utilizando Jinja2 en Ansible mediante el módulo debug o set fact.

Tengo la siguiente salida:

    TAREA [depurar] *******************************************************************
    ok: [1.1.1.1] => {
    "msg": [
        {
            "DESCRIP": "server-abc",
            "PORT": "Po3",
            "PROTOCOL": "up",
            "STATUS": "up"
        },
        {
            "DESCRIP": "Leaf-1",
            "PORT": "Po4",
            "PROTOCOL": "up",
            "STATUS": "up"
        },
        {
            "DESCRIP": "server-xyz",
            "PORT": "Po1",
            "PROTOCOL": "up",
            "STATUS": "up"
        },  
        {
            "DESCRIP": "Leaf-2",
            "PORT": "Po2",
            "PROTOCOL": "up",
            "STATUS": "up"
        }             
    ]
}

Quiero obtener / imprimir solo los bloques que contienen "Leaf" en DESCRIP y "Po" en PORT. Para hacer esto, tengo la siguiente depuración con jinja2:

 - depurar:
    msg: >-
           {%- for item in output.parsed -%}
           {%- if ('Leaf' in item.DESCRIP) and ('Po' in item.PORT) -%}
             "DESCRIP": {{item.DESCRIP}},
             "PORT": {{item.PORT}}
           {%- endif -%}
           {%- endfor -%}

Estoy obteniendo la siguiente salida imprimiendo todo en una sola línea:

TAREA [depurar] *******************************************************************
ok: [10.2.4.1] => {
    "msg": "\"DESCRIP\": Leaf-1,\n  \"PORT\": Po4\"\"DESCRIP\": Leaf-2,\n  \"PORT\": Po2"
}

Lo que quiero es el formato clave-valor del diccionario/formato JSON. como se muestra a continuación:

[{
    "DESCRIP": "Leaf-1",
    "PORT": "Po4",
},
{
    "DESCRIP": "Leaf-2",
    "PORT": "Po2",
} ]

Cómo/qué debo modificar en la sección msg de mi depuración para obtener la salida anterior

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada en formato de clave y valor del diccionario, puedes modificar la sección de mensajes de depuración de la siguiente manera:

    - debug:
        var: output.parsed | selectattr('DESCRIP', 'search', 'Leaf') | selectattr('PORT', 'search', 'Po') | map(attribute={'DESCRIP': item.DESCRIP, 'PORT': item.PORT}) | list
    

    Esto filtrará la lista en base a la condición de que ‘Leaf’ esté en DESCRIP y ‘Po’ esté en PORT, luego utiliza los filtros map y attribute para crear un diccionario con DESCRIP y PORT como claves y valores respectivamente. Finalmente, se utiliza el filtro list para convertirlo de nuevo en una lista.

Comments are closed.