Score:1

วิธีที่ดีที่สุดในการจัดรูปแบบ JSON ใหม่ด้วย Ansible

ธง cn
raw

ฉันมี JSON นี้ในตัวแปร:

{
"device_vlans": {
    "1": {
        "ชื่อ": "ค่าเริ่มต้น",
        "อินเทอร์เฟซ": [
            "GigabitEthernet1/1",
            "GigabitEthernet1/2",
            "GigabitEthernet1/3"
        ]
    },
    "20": {
        "ชื่อ": "VLAN20",
        "อินเทอร์เฟซ": [
            "GigabitEthernet1/2"
        ]
    },
    "30": {
        "ชื่อ": "VLAN30",
        "อินเทอร์เฟซ": [
            "GigabitEthernet1/3"
        ]
    }
}

แต่ฉันต้องการให้มีลักษณะดังนี้:

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

ขณะนี้ฉันกำลังวนลูปผ่านอินเทอร์เฟซทั้งหมดของอุปกรณ์ และภายในลูปนั้น ฉันกำลังวนลูปเหนือรายการทั้งหมดในตัวแปร device_vlans ด้วย a เมื่อ: รายการ == อินเทอร์เฟซ. มันช้ามากและทำให้มีปัญหา..

มีวิธีใดที่ดีกว่าในการทำเช่นนั้นด้วย ansible ?

ฉันคิดว่าตัวกรองแบบกำหนดเองจะเป็นวิธีแก้ปัญหาหรือไม่

Score:2
ธง br

สร้างรายการอุปกรณ์และอินเทอร์เฟซ

    - set_fact:
        dev_ifc: "{{ dev_ifc|d([]) + [{'dev': item.1, 'ifc': item.0.key}] }}"
      with_subelements:
        - "{{ device_vlans|dict2items }}"
        - ค่าอินเทอร์เฟซ

ให้

  dev_ifc:
    - {ผู้พัฒนา: GigabitEthernet1/1, ifc: '1'}
    - {ผู้พัฒนา: GigabitEthernet1/2, ifc: '1'}
    - {ผู้พัฒนา: GigabitEthernet1/3, ifc: '1'}
    - {ผู้พัฒนา: GigabitEthernet1/2, ifc: '20'}
    - {ผู้พัฒนา: GigabitEthernet1/3, ifc: '30'}

จากนั้นจัดกลุ่มรายการตามอุปกรณ์และสร้างพจนานุกรม

    - set_fact:
        device_vlans: "{{ dict(คีย์|zip(val)) }}"
      วาร์:
        arr: "{{ dev_ifc|groupby('dev') }}"
        คีย์: "{{ arr|แผนที่('อันดับแรก')|รายการ }}"
        val: "{{ arr|แผนที่('สุดท้าย')|
                     แผนที่('json_query', '[].ifc')|
                     แผนที่ ('community.general.dict_kv', 'ส่วนต่อประสาน')|
                     รายการ }}"

ให้

  device_vlans:
    GigabitEthernet1/1:
      อินเทอร์เฟซ: ['1']
    GigabitEthernet1/2:
      อินเทอร์เฟซ: ['1', '20']
    GigabitEthernet1/3:
      อินเทอร์เฟซ: ['1', '30']

เป็นไปได้ที่จะหลีกเลี่ยงการทำซ้ำในงาน ให้ใส่การวนซ้ำใน Jinja2 แทน ตัวอย่างเช่น ใส่การประกาศด้านล่างเป็น เหมาะสม

    dev_ifc_str: |-
      {% สำหรับ ifc ใน device_vlans.keys() %}
      {% สำหรับ dev ใน device_vlans[ifc]['interfaces'] %}
      - {ผู้พัฒนา: {{ dev }}, ifc: {{ ifc }}}
      {% สิ้นสุดสำหรับ %}
      {% สิ้นสุดสำหรับ %}
    dev_ifc: "{{ dev_ifc_str|from_yaml }}"
    device_vlans2: "{{ dict(_key|zip(_val)) }}"
    _arr: "{{ dev_ifc|groupby('dev') }}"
    _key: "{{ _arr|แผนที่('อันดับแรก')|รายการ }}"
    _val: "{{ _arr|แผนที่('สุดท้าย')|
                   แผนที่('json_query', '[].ifc')|
                   แผนที่ ('community.general.dict_kv', 'ส่วนต่อประสาน')|
                   รายการ }}"
cn flag
raw
ฉันได้รับข้อผิดพลาดกับ `val` var ที่ส่งคืน `` คุณมีทางออกหรือไม่?
br flag
เพิ่มตัวกรอง *รายการ* ลงในท่อ ฉันอัปเดตรหัส
cn flag
raw
ขอขอบคุณ ! @vladimir-botka

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา