Перебрать результат win_disk_facts, к которому добавлен пустой словарь вместе с результатом

Я пытаюсь перебрать доступные диски и получить несколько деталей. Я использую win_disk_facts, чтобы получить все диски, присутствующие на хосте, затем мне удается зациклиться и добавить результаты в переменную mdisk dict.

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

Я уверен, что проблема связана с синтаксисом, но я не понимаю, как добавить только словарь json, исключая пустой словарь {}, первым вхождением является пустой словарь, как показано здесь.

Код:

- name: get disk
  win_disk_fact:

- name:
  set_fact:
    mdisk: "{{mdisk|d({})}},
           {
           'name': '{{ item | json_query('friendly_name') }}',
           'Firmware_version': '{{ item | json_query('firmware_version') }}'
            }"
  loop: "{{ ansible_disks }}"

Вывод:

"ansible_facts": {
        "diskfact": [
            [
                {},
                {
                    " friendly_name": "abcde",
                    "firmware_version": "x1y2z3"
                }
            ],
            {
                " friendly_name ": "xyze",
                "'firmware_version'": "2341"
            }
        ]
    },
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это IMO очень сложно для чего-то, что может быть таким простым, как:

- name: print out the needed information
  ansible.builtin.debug:
    msg:
      - disk name is {{ item.friendly_name }}
      - firmware version is {{ item.firmware_version }}
  loop: "{{ ansible_disks }}"
  loop_control:
    label: "{{ item.friendly_name }}"

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

Если по какой-то причине (о которой мы не можем догадаться из вашего вопроса и которую мне действительно трудно понять...) вам действительно нужно преобразовать имя переменной, некоторые имена ключей и количество ключей внутри каждого элемента, вы может по-прежнему сохранять принцип KISS (хотя он сам по себе делает вещи слишком сложными по сравнению с использованием исходного var напрямую IMO).

- name: make a var out of an other var
  vars:
    query: '[].{"name": "friendly_name", "firmware_version": "firmware_version"}'
  ansible.builtin.set_fact:
    mdisk: "{{ ansible_disks | json_query(query) }}"

Теперь, чтобы ответить на ваш прямой вопрос, если вы все еще хотите выполнить вышеуказанное преобразование и построить переменную с помощью итерации, вы можете это сделать. Но это во всех отношениях наименее эффективный сценарий.

- name: make a var out of an other var
  vars:
    current_disk:
      name: "{{ item.friendly_name }}"
      firmware_version: "{{ item.firmware_version }}"
  ansible.builtin.set_fact:
    mdisk: "{{ mdisk | d([]) + [current_disk] }}"
  loop: "{{ ansible_disks }}"
  loop_control:
    label: "{{ item.friendly_name }}"

Между тем, обратите внимание, что ansible_disks и mdisk — это списки (элементов словаря), а не словари.

Большое спасибо за ваше подробное объяснение/предложения. Чтобы прояснить имена переменных, я пытаюсь сопоставить имена атрибутов БД здесь. Результат Json из этого кода будет отправлен в мою базу данных через API, вот где я пытаюсь назначить его новое имя переменной. И я здесь новичок, пытаюсь работать со списками, словарями. Я попробовал предложенные вами изменения, первый вариант у меня работает нормально, а второй вариант дает пустые результаты «mdisk»: «» . Третий предлагаемый вариант выдает сообщение: непредвиденная ошибка типа шаблона ({{ mdisk | d([]) + [disk_info]}}) может только конкатенировать str (не \"список\") в str .

User050488 06.11.2022 04:51

Какую версию Ansible вы используете?

Zeitounator 06.11.2022 07:51

Пробовал с 2.13.2.

User050488 06.11.2022 08:56

Для второго варианта была опечатка в начальном имени var (исправлено). Что касается последнего (и, я настаиваю, худшего варианта), я предполагаю, что mdisk уже объявлен где-то в вашей среде как строка, тогда как при первом входе в цикл он должен быть неопределенным (или, по крайней мере, должен быть списком). Полная работа с тем, что, я думаю, является вашей исходной структурой переменных . Для вашего следующего вопроса, пожалуйста, прочитайте Как спросить и обратите внимание на раздел минимального воспроизводимого примера. В частности, в этом вопросе отсутствует исходная структура данных примера. Спасибо.

Zeitounator 06.11.2022 09:38

Спасибо большое, все 3 работают. И спасибо за ваше терпение в помощи и обмене необходимыми ссылками.

User050488 08.11.2022 12:00

Пожалуйста. ТАК способ сказать «спасибо» - это принять (зеленая галочка) и/или проголосовать за ответы, которые вы нашли полезными. Смотрите Что делать, когда кто-то отвечает на мой вопрос

Zeitounator 08.11.2022 17:28

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