Парсинг JSON от Ansible - PullRequest
       29

Парсинг JSON от Ansible

0 голосов
/ 23 октября 2019

Я смотрю в Интернете, но не могу найти решение, сценарий довольно сложный. У меня есть один массив json со значениями, подобными этим:

[
  {
      "IP1": "1.2.3.4"
      "IP1_VLAN": "900 - CLOUD-DEV"
      "IP1_Role": "Management"
      "IP2": "4.5.6.7"
      "IP2_VLAN": "901 - CLOUD-DEV"
      "IP2_Role": "Production"
      "IP2": "8.9.10.11"
      "IP2_VLAN": "902 - CLOUD-DEV"
      "IP2_Role": "Backup"
  }
]   

Моя цель: «Выберите IP с ролью Management и сообщите мне адрес», он должен выбрать IP*_Role == Management и сообщить мне об этомcase 1.2.3.4

У вас есть идеи, как с этим справиться?

1 Ответ

0 голосов
/ 23 октября 2019

После моего комментария мой ответ за 2 цента: поиск в вашей реальной структуре данных будет трудным и уродливым. Если у вас есть возможность немного его изменить, все может стать намного проще.

Вот пример использования списка, объявленного в yaml в следующей демонстрационной книге. Данные извлекаются с использованием json_query с соответствующим выражением jmespath (т. Е. Переменная query в задаче отладки)

---
- hosts: localhost
  gather_facts: False

  vars:
    my_ips:
      - ip: "1.2.3.4"
        vlan: "900 - CLOUD-DEV"
        role: "Management"
      - ip: "4.5.6.7"
        vlan: "901 - CLOUD-DEV"
        role: "Production"
      - ip: "8.9.10.11"
        vlan: "902 - CLOUD-DEV"
        role: "Backup"

  tasks:
    - name: Get ips per role
      vars:
        query: >-
          [?role=='{{ item }}']
      debug:
        msg: "List of ips for role {{ item }}: {{ my_ips | json_query(query) }}"
      loop:
        - Management
        - Production
        - Backup

, которая дает

PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************

TASK [Get ips per role] *************************************************************************************************************************************************************************************************************************************************
Wednesday 23 October 2019  16:14:23 +0200 (0:00:00.043)       0:00:00.043 ***** 
ok: [localhost] => (item=Management) => {
    "msg": "List of ips for role Management: [{'ip': '1.2.3.4', 'vlan': '900 - CLOUD-DEV', 'role': 'Management'}]"
}
ok: [localhost] => (item=Production) => {
    "msg": "List of ips for role Production: [{'ip': '4.5.6.7', 'vlan': '901 - CLOUD-DEV', 'role': 'Production'}]"
}
ok: [localhost] => (item=Backup) => {
    "msg": "List of ips for role Backup: [{'ip': '8.9.10.11', 'vlan': '902 - CLOUD-DEV', 'role': 'Backup'}]"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Эквивалентное объявление переменной в обычном json будет:

[
  {
    "ip": "1.2.3.4",
    "vlan": "900 - CLOUD-DEV",
    "role": "Management"
  },
  {
    "ip": "4.5.6.7",
    "vlan": "901 - CLOUD-DEV",
    "role": "Production"
  },
  {
    "ip": "8.9.10.11",
    "vlan": "902 - CLOUD-DEV",
    "role": "Backup"
  }
]

Если вам нужно загрузить это из внешней строки (например, загрузить файл ...), вы можете использоватьfrom_json фильтр в вашей пьесе

...