Как прочитать значение из вывода json

По сути, мне нужно прочитать значение из вывода JSON и использовать его в последующих задачах. Итак, я попробовал with_items, loop, но ничего не вышло.

Пример JSON, который я создал из зарегистрированной переменной:

   TASK [local_volume_mount : debug Info from device that is parted] **************
   Monday 29 March 2021  21:33:39 +0000 (0:00:02.271)       0:00:02.417 ********** 
   ok: [node1] => {
       "partitioned_device_live_info": {
           "changed": false,
           "msg": "All items completed",
           "results": [
               {
                   "ansible_loop_var": "item",
                   "changed": false,
                   "disk": {
                       "dev": "/dev/nvme2n1",
                       "logical_block": 512,
                       "model": "SAMSUNG MZQLW960HMJP-00003",
                       "physical_block": 512,
                       "size": 937692504.0,
                       "table": "msdos",
                       "unit": "kib"
                   },
                   "failed": false,
                   "invocation": {
                       "module_args": {
                           "align": "optimal",
                           "device": "/dev/nvme2n1",
                           "flags": null,
                           "label": "msdos",
                           "name": null,
                           "number": 1,
                           "part_end": "100%",
                           "part_start": "0%",
                           "part_type": "primary",
                           "state": "present",
                           "unit": "KiB"
                       }
                   },
                   "item": [
                       {
                           "device": "/dev/nvme2n1",
                           "partitions": [
                               {
                                   "end": "100%",
                                   "number": 1,
                                   "start": "0%",
                                   "storage_class": "ssd-wkr-services"
                               }
                           ]
                       },
                       {
                           "end": "100%",
                           "number": 1,
                           "start": "0%",
                           "storage_class": "ssd-wkr-services"
                       }
                   ],
                   "partitions": [
                       {
                           "begin": 1024.0,
                           "end": 937692160.0,
                           "flags": [],
                           "fstype": "",
                           "name": "",
                           "num": 1,
                           "size": 937691136.0,
                           "unit": "kib"
                       }
                   ],
                   "script": ""
               }
           ]
       }
   }
   

Итак, из приведенного выше мне нужно прочитать значение partitions.num и использовать его в следующей задаче, но я не знаю, как это сделать.

Задача:

  - name: THIS IS BEING TESTED
    debug:
      var: "{{ item.partitions }}"
    ignore_errors: no
    #loop: "{{ partitioned_device_live_info.results }}"
    with_items: "{{ partitioned_device_live_info.results }}"

Результатом вышеуказанной задачи является

'dict object' has no attribute 'partitions'

Я хочу сохранить это значение item.partitions.num в переменной, а затем использовать его в дальнейших задачах.

Задача, которую вы здесь предоставляете, не может дать той ошибки, о которой вы заявляете. "{{ partitions }}" может выдать эту ошибку. Но "{{ item.partitions }}" скорее отдаст 'dict object' has no attribute 'partitions'. Итак, вам следует вернуться к своему минимальный воспроизводимый пример

β.εηοιτ.βε 30.03.2021 00:57

да: мой плохой, у меня было несколько, поэтому при вставке могла быть ошибка. обновленный вопрос

AhmFM 30.03.2021 01:23
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
30
2

Ответы 2

Выяснилось с помощью msg, ниже мое изменение


  - name: THIS IS BEING TESTED with MSG and with_items
    debug:
      msg: "{{ item.partitions[0].num }}"
    with_items: "{{ partitioned_device_live_info.results }}"

Вы всегда можете использовать регулярное выражение, доступное для set facts. Подробнее переполнение стека

Ниже приведены некоторые варианты использования.

- name: Long form task does not
  ansible.builtin.replace:
    path: /etc/hosts
    regexp: '\b(localhost)(\d*)\b'
    replace: '\1\2.localdomain\2 \1\2'

- name: Explicitly specifying positional matched groups in replacement
  ansible.builtin.replace:
    path: /etc/ssh/sshd_config
    regexp: '^(ListenAddress[ ]+)[^\n]+$'
    replace: '\g<1>0.0.0.0'

Настройка fact

- name: set version in file after replacement
  set_fact:
    version_in_file: "{{ version_deployment_file | regex_search(docker_image_version) }}"

Подробнее - ansible.builtin.replace

Я серьезно не могу сопоставить ваш ответ с моим вопросом. можешь объяснить, как твой ответ помогает в моей ситуации?

AhmFM 01.04.2021 01:11

Я вижу, вы составили точную карту. Для меня я использую регулярное выражение для извлечения фактов из вывода, я использую замену регулярного выражения для их изменения в соответствии с требованиями.

codeaprendiz 01.04.2021 14:29

Другие вопросы по теме