将PyATS Ansible playbook 输出保存到一个json文件:

- name: Export variable to file
  copy:
    content: "{{ output }}"
    dest: "report.json"

Json内容如下:

{
  "results": [
    {
      "structured": {
        "interfaces": {
          "Port-channel11": {
            "ipv4": {
              "neighbors": {
                "1.1.0.1": {
                  "ip": "1.1.0.1",
                  "link_layer_address": "0000.0000.00ca"
                }
              }
            }
          },
          "GigabitEthernet1": {
            "ipv4": {
              "neighbors": {
                "1.1.1.2": {
                  "ip": "1.1.1.2",
                  "link_layer_address": "0000.0000.00cb"
                },
                "1.1.1.3": {
                  "ip": "1.1.1.3",
                  "link_layer_address": "0000.0000.00cc"
                }
              }
            }
          }
        }
      },
      "item": {
        "key": "vrf1",
        "value": {
          "route_distinguisher": "1:1",
          "interfaces": [
            "GigabitEthernet1",
            "Port-channel11"
          ]
        }
      },
      "ansible_loop_var": "item"
    },
    {
      "structured": {
        "interfaces": {
          "Port-channel2": {
            "ipv4": {
              "neighbors": {
                "2.2.2.200": {
                  "ip": "2.2.2.200",
                  "link_layer_address": "0000.0000.00dd"
                }
              }
            }
          }
        }
      },
      "item": {
        "key": "vrf2",
        "value": {
          "route_distinguisher": "2:2",
          "interfaces": [
            "Port-channel2"
          ]
        }
      },
      "ansible_loop_var": "item"
    }
  ],
  "skipped": false,
  "msg": "All items completed",
  "changed": false
}

我想从这个json文件创建一个包含以下数据的csv文件:

{{ ansible_host/inventory_host }},vrf1,Port-channel11,1.1.0.1,0000.0000.00ca
{{ ansible_host/inventory_host }},vrf1,GigabitEthernet1,1.1.1.2,0000.0000.00cb
{{ ansible_host/inventory_host }},vrf1,GigabitEthernet1,1.1.1.3,0000.0000.00cc
{{ ansible_host/inventory_host }},vrf2,Port-channel2,2.2.2.200,0000.0000.00dd

我能联系到的最近的是:

    - name: Set vrflength variable
      set_fact:
        vrflength: "{{ output.results | length }}"

    - name: Set vrfmaxindex variable
      set_fact:
        vrfmaxindex: "{{ (vrflength | int) - 1 }}"

    - name: Create file
      lineinfile:
        insertafter: EOF
        dest: "report1.csv"
        line: "{{ inventory_hostname }},{{ output.results[ item | int ].item.key }},{{ output.results[ item | int ].structured.interfaces }}"
      with_sequence: start=0 end="{{ vrfmaxindex }}"
`device1,vrf1,{"Port-channel11":{"ipv4":{"neighbors":{"1.1.0.1":{"ip":"1.1.0.1","link_layer_address":"0000.0000.00ca"}}}},"GigabitEthernet1":{"ipv4":{"neighbors":{"1.1.1.2":{"ip":"1.1.1.2","link_layer_address":"0000.0000.00cb"},"1.1.1.3":{"ip":"1.1.1.3","link_layer_address":"0000.0000.00cc"}}}}}

device1,vrf2,{"Port-channel2":{"ipv4":{"neighbors":{"2.2.2.200":{"ip":"2.2.2.200","link_layer_address":"0000.0000.00dd"}}}}}`

我不知道如何构建所需的嵌套循环(对于每个VRF,对于每个接口,对于每个邻居,在独立的CSV行上打印设备名称、VRF名称、邻居IP和MAC).

会非常感谢任何人的帮助.

推荐答案

用金佳.例如,这出戏

- hosts: all

  vars:

    _csv: |
      {% for i in output.results %}
      {% set key=i.item.key %}
      {% for k,v in i.structured.interfaces.items() %}
      {% for n,l in v.ipv4.neighbors.items() %}
      {{ key }},{{ k }},{{ n }},{{ l.link_layer_address }}
      {% endfor %}
      {% endfor %}
      {% endfor %}

  tasks:

    - include_vars:
        file: report.json
        name: output

    - debug:
        var: _csv

给予(删节)

  _csv: |-
    vrf1,Port-channel11,1.1.0.1,0000.0000.00ca
    vrf1,GigabitEthernet1,1.1.1.2,0000.0000.00cb
    vrf1,GigabitEthernet1,1.1.1.3,0000.0000.00cc
    vrf2,Port-channel2,2.2.2.200,0000.0000.00dd

Json相关问答推荐

如何在Haskell中解析JSON,其中字段的名称可以是多个值之一,但应该转换为单个Haskell类型?

PowerShell女士:如何处理json对象?

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

Jolt 变换以展平 json 字符串数组

Rust实现:高效解析任意大小的JSON数组

在 NX 工作区中跨多个应用共享 ngx-translate 翻译文件

使用 jolt 将对象数组转换为数组

用powershell条件解析json文件的数组对象

ORA-01422: 精确提取返回的行数超过了与 json 对象组合的请求数

jq搜索特定字符串并输出对应的父值

Golang / Go - 如果 struct 没有字段,如何将其编组为空?

Newtonsoft Json 将值 {null} 转换为类型System.Int32时出错

如何为名称/值 struct 创建 JSON 模式?

如何使用 Jackson 定义可选的 json 字段

以 unicode 将 pandas DataFrame 写入 JSON

PostgreSQL 中的 JSON 模式验证?

我可以使用空字符串作为对象标识符吗?

POST:在 url 本身中发送 post 请求

如何从 MVC 控制器返回 Json 对象以查看

如何使用 Jackson 的 objectMapper 反序列化接口字段?