Puncte:1

Cel mai bun mod de a reformata un JSON cu Ansible?

drapel cn
raw

Am acest JSON într-o variabilă:

{
„device_vlans”: {
    „1”: {
        "nume": "implicit",
        „interfețe”: [
            „GigabitEthernet1/1”,
            „GigabitEthernet1/2”,
            „GigabitEthernet1/3”
        ]
    },
    „20”: {
        "nume": "VLAN20",
        „interfețe”: [
            „GigabitEthernet1/2”
        ]
    },
    „30”: {
        "nume": "VLAN30",
        „interfețe”: [
            „GigabitEthernet1/3”
        ]
    }
}

Dar am nevoie să arate mai mult așa:

{
„device_vlans”: {
    „GigabitEthernet1/1”: {
        "vlans": [
            "1"
        ]
    },
    „GigabitEthernet1/2”: {
        "vlans": [
            „1”,
            "20"
        ]
    },
    „GigabitEthernet1/3”: {
        "vlans": [
            „1”,
            "30"
        ]
    }
}

În prezent, fac buclă peste toate interfețele dispozitivului și în interiorul acelei bucle, fac bucla peste toate elementele din variabila device_vlans cu un când: element == interfață. Este foarte lent și îmi provoacă probleme...

Există vreo modalitate mai bună de a face asta cu ansible?

M-am gândit la un filtru personalizat ar fi asta soluția?

Puncte:2
drapel br

Creați o listă de dispozitive și interfețe

    - set_fact:
        dev_ifc: „{{ dev_ifc|d([]) + [{'dev': item.1, 'ifc': item.0.key}] }}"
      cu_subelemente:
        - „{{ device_vlans|dict2items }}”
        - valoare.interfeţe

  dev_ifc:
    - {dev: GigabitEthernet1/1, ifc: '1'}
    - {dev: GigabitEthernet1/2, ifc: '1'}
    - {dev: GigabitEthernet1/3, ifc: '1'}
    - {dev: GigabitEthernet1/2, ifc: '20'}
    - {dev: GigabitEthernet1/3, ifc: '30'}

Apoi, grupați lista după dispozitive și creați dicționarul

    - set_fact:
        device_vlans: „{{ dict(key|zip(val)) }}”
      vars:
        arr: "{{ dev_ifc|groupby('dev') }}"
        cheie: "{{ arr|hartă('primul')|listă }}"
        val: „{{ arr|hartă('ultimul')|
                     map('json_query', '[].ifc')|
                     map('community.general.dict_kv', 'interfeţe')|
                     lista }}"

  device_vlans:
    GigabitEthernet1/1:
      interfețe: ['1']
    GigabitEthernet1/2:
      interfețe: ['1', '20']
    GigabitEthernet1/3:
      interfețe: ['1', '30']

Este posibil să evitați iterația într-o sarcină. În schimb, puneți iterația în Jinja2. De exemplu, puneți declarațiile de mai jos ca adecvat

    dev_ifc_str: |-
      {% pentru ifc în device_vlans.keys() %}
      {% pentru dev în device_vlans[ifc]['interfaces'] %}
      - {dev: {{ dev }}, ifc: {{ ifc }}}
      {% endfor %}
      {% endfor %}
    dev_ifc: „{{ dev_ifc_str|from_yaml }}”
    device_vlans2: „{{ dict(_key|zip(_val)) }}”
    _arr: „{{ dev_ifc|groupby('dev') }}”
    _key: „{{ _arr|hartă(’primul’)|listă }}”
    _val: „{{ _arr|hartă('ultimul')|
                   map('json_query', '[].ifc')|
                   map('community.general.dict_kv', 'interfeţe')|
                   lista }}"
drapel cn
raw
Primesc o eroare cu `val` var care se întoarce `` ai o solutie?
drapel br
Adăugați filtrul *list* în conductă. Am actualizat codul.
drapel cn
raw
Mulțumesc ! @vladimir-botka

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.