Điểm:1

Cách tốt nhất để định dạng lại JSON bằng Ansible?

lá cờ cn
raw

Tôi có JSON này trong một biến:

{
"thiết bị_vlan": {
    "1": {
        "tên": "mặc định",
        "giao diện": [
            "GigabitEthernet1/1",
            "GigabitEthernet1/2",
            "GigabitEthernet1/3"
        ]
    },
    "20": {
        "tên": "VLAN20",
        "giao diện": [
            "GigabitEthernet1/2"
        ]
    },
    "30": {
        "tên": "VLAN30",
        "giao diện": [
            "GigabitEthernet1/3"
        ]
    }
}

Nhưng tôi cần nó để trông giống như thế này:

{
"thiết bị_vlan": {
    "GigabitEthernet1/1": {
        "vlan": [
            "1"
        ]
    },
    "GigabitEthernet1/2": {
        "vlan": [
            "1",
            "20"
        ]
    },
    "GigabitEthernet1/3": {
        "vlan": [
            "1",
            "30"
        ]
    }
}

Hiện tại tôi đang lặp qua tất cả các giao diện của thiết bị và bên trong vòng lặp đó tôi đang lặp qua tất cả các mục trong biến device_vlans với một khi nào: mục == giao diện. Nó thực sự chậm và gây ra vấn đề cho tôi ..

Có cách nào tốt hơn để làm điều đó với ansible không?

Tôi nghĩ về một bộ lọc tùy chỉnh đó có phải là giải pháp không?

Điểm:2
lá cờ br

Tạo danh sách thiết bị và giao diện

    - bộ_thực tế:
        dev_ifc: "{{dev_ifc|d([]) + [{'dev': item.1, 'ifc': item.0.key}] }}"
      with_subelements:
        - "{{ device_vlans|dict2items }}"
        - giá trị.interfaces

cho

  dev_ifc:
    - {dev: GigabitEthernet1/1, ifc: '1'}
    - {nhà phát triển: GigabitEthernet1/2, ifc: '1'}
    - {dev: GigabitEthernet1/3, ifc: '1'}
    - {nhà phát triển: GigabitEthernet1/2, ifc: '20'}
    - {dev: GigabitEthernet1/3, ifc: '30'}

Sau đó, nhóm danh sách theo thiết bị và tạo từ điển

    - bộ_thực tế:
        device_vlans: "{{ dict(key|zip(val)) }}"
      lọ:
        mảng: "{{dev_ifc|groupby('dev') }}"
        khóa: "{{mảng|bản đồ('đầu tiên')|danh sách }}"
        val: "{{ mảng|bản đồ('cuối')|
                     map('json_query', '[].ifc')|
                     map('community.General.dict_kv', 'giao diện')|
                     danh sách }}"

cho

  thiết bị_vlan:
    GigabitEthernet1/1:
      giao diện: ['1']
    GigabitEthernet1/2:
      giao diện: ['1', '20']
    GigabitEthernet1/3:
      giao diện: ['1', '30']

Có thể tránh lặp lại trong một nhiệm vụ. Thay vào đó, hãy đặt phép lặp vào Jinja2. Ví dụ: đặt các khai báo bên dưới là thích hợp

    dev_ifc_str: |-
      {% cho ifc trong device_vlans.keys() %}
      {% cho nhà phát triển trong 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|map('first')|list }}"
    _val: "{{ _arr|map('last')|
                   map('json_query', '[].ifc')|
                   map('community.General.dict_kv', 'giao diện')|
                   danh sách }}"
lá cờ cn
raw
Tôi đang gặp lỗi với `val` var it return ``bạn có giải pháp nào không?
lá cờ br
Thêm bộ lọc *list* vào đường ống. Tôi đã cập nhật mã.
lá cờ cn
raw
Cảm ơn bạn ! @vladimir-botka

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.