Ansible从JSON嵌套字典中提取数据进行分析

2024-09-25 00:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Ansible解析器,它将一些CLI输出解析为下面的JSON,下面是一个路由器的示例

{
    "ansible_facts": {
        "bgp_summary_facts": [
            {
                "65001_10.10.10.1": {
                    "Data": {
                        "inq": "0",
                        "msgrcvd": "638",
                        "msgsent": "424",
                        "neighbor": "10.10.10.1",
                        "uptime": "01:35:54",
                        "peer_as": "65001",
                        "state": "2",
                        "tblver": "0",
                        "version": "4"
                    }
                }
            },
            {
                "65001_10.10.10.2": {
                    "Data": {
                        "inq": "0",
                        "msgrcvd": "208364",
                        "msgsent": "424",
                        "neighbor": "10.10.10.2",
                        "uptime": "3w1d",
                        "peer_as": "65001",
                        "state": "71",
                        "tblver": "0",
                        "version": "4"
                    }
                }
            },
            {
                "65002_10.10.20.1": {
                    "Data": {
                        "inq": "0",
                        "msgrcvd": "0",
                        "msgsent": "1",
                        "neighbor": "10.10.20.1",
                        "uptime": "never",
                        "peer_as": "65002",
                        "state": "Idle",
                        "tblver": "0",
                        "version": "4"
                    }
                }
            },
            {
                "65010": {
                    "Data": {
                        "inq": "0",
                        "msgrcvd": "22611",
                        "msgsent": "424",
                        "neighbor": "10.10.30.1",
                        "uptime": "2d11h",
                        "peer_as": "65010",
                        "state": "36",
                        "tblver": "0",
                        "version": "4"
                    }
                }
            }
        ]
    },
    "changed": false,
    "included": [
        "parsers/ios/show_ip_bgp_summary.yml"
    ]
}

现在我绞尽脑汁,搜索并阅读了几天的教程,教我如何提取这些数据进行分析

我的剧本现在以这个结尾,使用一些教程,我想我可以尝试使用JMESPath来实现它,为此我尝试了大量的格式,我也尝试过循环使用字典项,我试图将我的解析器转换为使用字典列表而不是字典字典字典,但令我感到沮丧的是,我什么也得不到。在

我的最终目标是在一个循环中处理每个字典来执行分析,最简单的一个是输出哪个对等点关闭(状态没有整数)

^{pr2}$

最终目标示例:

RTR-01
neighbour 10.10.20.1 is down
RTR-02
neighbour 10.30.20.1 is down

或者

RTR-01型

| neighbour  | bgp as | prefixes | uptime   |
|------------|--------|----------|----------|
| 10.10.10.1 | 65001  | 2        | 01:35:54 |
| 10.10.10.2 | 65001  | 2        | 3w1d     |
| 10.10.20.1 | 65002  |          | never    |

对每个路由器都是如此


Tags: data字典versionasbgpstateuptimepeer
2条回答

我已经为上面创建了一个jinja2模板。输出是相似的,但我对条件有一些困惑,但我想在这里分享。在

如果你能举例说明就好了。在


行动手册:

- name: hosts
  hosts: localhost
  tasks:
    - name: include vars
      include_vars: vars_t4.yml

    - name: template module
      template:
        src: template/source.json
        dest: target/final.json

模板

^{pr2}$

输出

RTR-0
neighbour 10.10.10.1 is down

RTR-0
neighbour 10.10.10.2 is down

RTR-0
neighbour 10.10.20.1 is down

RTR-0
neighbour 10.10.30.1 is down

如果我的需求是正确的,这里有一种方法来解析var并得到您列出的“决策”。在

PB,测试变量包括:

 -
- hosts: localhost
  gather_facts: false
  vars:
    test_var:
      bgp_summary_facts:
      - 65001_10.10.10.1:
          Data:
            inq: "0"
            msgrcvd: "638"
            msgsent: "424"
            neighbor: 10.10.10.1
            uptime: "01:35:54"
            peer_as: "65001"
            state: "2"
            tblver: "0"
            version: "4"
      - 65001_10.10.10.2:
          Data:
            inq: "0"
            msgrcvd: "208364"
            msgsent: "424"
            neighbor: 10.10.10.2
            uptime: 3w1d
            peer_as: "65001"
            state: "71"
            tblver: "0"
            version: "4"
      - 65002_10.10.20.1:
          Data:
            inq: "0"
            msgrcvd: "0"
            msgsent: "1"
            neighbor: 10.10.20.1
            uptime: never
            peer_as: "65002"
            state: Idle
            tblver: "0"
            version: "4"
      - "65010":
          Data:
            inq: "0"
            msgrcvd: "22611"
            msgsent: "424"
            neighbor: 10.10.30.1
            uptime: 2d11h
            peer_as: "65010"
            state: "36"
            tblver: "0"
            version: "4"
    changed: false
    included:
    - parsers/ios/show_ip_bgp_summary.yml


  tasks:
  - name: print var
    debug:
      msg: "bgp: {{ item.keys() | first }}, Neighbor: {{ item[item.keys() | first].Data['neighbor'] }}, uptime: {{ item[item.keys() | first].Data['uptime'] }}"
    with_items: "{{ test_var.bgp_summary_facts }}"

  - name: print var is down
    debug:
      msg: "is down"
    when: item[item.keys() | first].Data['state'] | int == false
    with_items: "{{ test_var.bgp_summary_facts }}"

为了方便起见,我写了2个任务。如果您想像您的示例一样生成一个表,那么您可能应该使用jinja模板任务。在

结果:

^{pr2}$

希望有帮助

相关问题 更多 >