json_query в ansible для поиска значения ключа и печати другого ключа в объекте json

#ansible #ansible-2.x #json-query

#ansible #ansible-2.x #json-запрос

Вопрос:

это необработанные данные, которые я хочу найти с помощью json_query в ansible с keyvalue= 65060 и распечатать соответствующего соседа, может кто-нибудь, пожалуйста, помогите.

пока я получил это:

    - name: data manipulate
      debug: msg="{{ msnjson | json_query(msnquery) }}"
      vars:
        msnquery: "[*].AS"
  

но это просто отображает все КАК ключи, но я ищу именно ключ со значением 65060 и соответствующий соседний ключ.

 [
  {
    "AS": "65060",
    "InQ": "0",
    "MsgRcvd": "258259",
    "MsgSent": "120410",
    "Neighbor": "99.99.99.5",
    "OutQ": "0",
    "Spk": "0",
    "StPfxRcd": "1",
    "TblVer": "2241",
    "UpDown": "2w0d"
  },
  {
    "AS": "64600",
    "InQ": "0",
    "MsgRcvd": "281828",
    "MsgSent": "120498",
    "Neighbor": "192.168.100.1",
    "OutQ": "0",
    "Spk": "0",
    "StPfxRcd": "33",
    "TblVer": "2241",
    "UpDown": "12w5d"
  },
  {
    "AS": "64600",
    "InQ": "0",
    "MsgRcvd": "281867",
    "MsgSent": "120498",
    "Neighbor": "192.168.100.2",
    "OutQ": "0",
    "Spk": "0",
    "StPfxRcd": "33",
    "TblVer": "2241",
    "UpDown": "12w5d"
  },
  {
    "AS": "64600",
    "InQ": "0",
    "MsgRcvd": "258516",
    "MsgSent": "120499",
    "Neighbor": "192.168.100.4",
    "OutQ": "0",
    "Spk": "0",
    "StPfxRcd": "19",
    "TblVer": "2241",
    "UpDown": "5w6d"
  }
]
  

Ответ №1:

Попробуйте

     - name: data manipulate
      debug: msg="{{ msnjson | json_query(msnquery) }}"
      vars:
        msnquery: "[?AS=='65060'].Neighbor"
  

Обновить

Существует несколько элементов с одинаковым значением AS . Может быть целесообразно создать словарь, если вам приходится многократно искать Neighbor по AS . Например,

   AS_Neighbors: "{{ [msnjson|json_query(msnquery), []]|
                    community.general.lists_mergeby('AS', list_merge='append')|
                    items2dict(key_name='AS', value_name='Neighbor') }}"
  msnquery: "[].{AS: AS, Neighbor: [Neighbor]}"
  

дает

   AS_Neighbors:
    '64600':
    - 192.168.100.1
    - 192.168.100.2
    - 192.168.100.4
    '65060':
    - 99.99.99.5
  

Пример полного сборника заданий для тестирования

 - hosts: localhost

  vars:

    AS_Neighbors: "{{ [msnjson|json_query(msnquery), []]|
                      community.general.lists_mergeby('AS', list_merge='append')|
                      items2dict(key_name='AS', value_name='Neighbor') }}"
    msnquery: "[].{AS: AS, Neighbor: [Neighbor]}"

    msnjson:
      - AS: '65060'
        InQ: '0'
        MsgRcvd: '258259'
        MsgSent: '120410'
        Neighbor: 99.99.99.5
        OutQ: '0'
        Spk: '0'
        StPfxRcd: '1'
        TblVer: '2241'
        UpDown: 2w0d
      - AS: '64600'
        InQ: '0'
        MsgRcvd: '281828'
        MsgSent: '120498'
        Neighbor: 192.168.100.1
        OutQ: '0'
        Spk: '0'
        StPfxRcd: '33'
        TblVer: '2241'
        UpDown: 12w5d
      - AS: '64600'
        InQ: '0'
        MsgRcvd: '281867'
        MsgSent: '120498'
        Neighbor: 192.168.100.2
        OutQ: '0'
        Spk: '0'
        StPfxRcd: '33'
        TblVer: '2241'
        UpDown: 12w5d
      - AS: '64600'
        InQ: '0'
        MsgRcvd: '258516'
        MsgSent: '120499'
        Neighbor: 192.168.100.4
        OutQ: '0'
        Spk: '0'
        StPfxRcd: '19'
        TblVer: '2241'
        UpDown: 5w6d

  tasks:

    - debug:
        var: AS_Neighbors
  

Комментарии:

1. потрясающе, это сработало. Я подумал, что сначала нам нужно исключить список, а затем сопоставить ключ. большое вам спасибо, оценили!