Выражение запроса JMESPath с диапазоном значений - PullRequest
0 голосов
/ 03 декабря 2018

У меня ниже JSON, у которого есть диапазон.Я пытаюсь получить значения из JSON для конкретной записи из диапазона, который будет использоваться в качестве переменной ANSIBLE.

например, я хотел бы получить значение folder, равное server002 снизу json, для использования в качестве переменной ANSI с использованием фильтра запросов JSON.Пожалуйста, помогите.

[
{"hosts": "server001:060",
"values": {
    "folder": "/my_folder1/",
    "pool": "pool1",
    "dsname": "DS1",
    "network": "nw_1"
}},
{"hosts": "server061:080",
"values": {
    "folder": "/my_folder2/",
    "pool": "pool2",
    "dsname": "DS2",
    "network": "nw_2"
}}
]

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ниже приведена рабочая игра, которая должна удовлетворить ваш сценарий использования:

---
- name: JSON range extraction
  hosts: 127.0.0.1
  connection: local
  gather_facts: no
  tasks:
    - name: Set facts for search
      set_fact:
        host_to_find: '002'
        hosts_json_string: '[{"hosts":"server001:060","values":{"folder":"/my_folder1/","pool":"pool1","dsname":"DS1","network":"nw_1"}},{"hosts":"server061:080","values":{"folder":"/my_folder2/","pool":"pool2","dsname":"DS2","network":"nw_2"}}]'

    - name: Convert json string to facts
      set_fact:
        hosts_data: "{{ hosts_json_string | from_json }}"

    - name: Sort json by hosts and replace the value of hosts to make range extraction easier
      set_fact:
        sorted_hosts: "{{hosts_data|sort(attribute='hosts')|regex_replace('(server(\\d+):(\\d+))','\\2-\\3')}}"

    - name: Find index of host_to_find in sorted_hosts and set_fact
      vars:
        hosts_range: "{{sorted_hosts| json_query('[*].hosts')}}"
      set_fact:
        host_index: "{% for range in hosts_range %}{% set range_split = range.split('-') %}{% if ((host_to_find|int >= range_split[0]|int) and (host_to_find|int <= range_split[1]|int)) %}{{ loop.index0 }}{% endif %}{% endfor %}"

    - name: Get the folder location
      set_fact:
        folder_location: "{{ sorted_hosts[host_index|int].get('values').folder }}"
      when: not host_index == ""
...
0 голосов
/ 03 декабря 2018

Я не вижу server002 в вашем примере, но ниже приведен пример поиска второго сервера в вашем списке.(Измените 'json_file_path' на путь, в котором находится ваш файл JSON.)

- name: Set search facts
  set_fact:
     host_to_find: 'server061:080'
     json_file_path: <path to json file>
- name: Get data for host
  vars:
    hosts_data: "{{ lookup('file', json_file_path) | from_json }}"
  set_fact:
    host: "{{ hosts_data | selectattr('hosts', 'match', host_to_find) | list | first }}"
- name: Display value of folder var
  debug:
    var: host['values']['folder']
...