Я пытаюсь перебрать доступные диски и получить несколько деталей. Я использую 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"
}
]
},
Это 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
— это списки (элементов словаря), а не словари.
Какую версию Ansible вы используете?
Пробовал с 2.13.2.
Для второго варианта была опечатка в начальном имени var (исправлено). Что касается последнего (и, я настаиваю, худшего варианта), я предполагаю, что mdisk
уже объявлен где-то в вашей среде как строка, тогда как при первом входе в цикл он должен быть неопределенным (или, по крайней мере, должен быть списком). Полная работа с тем, что, я думаю, является вашей исходной структурой переменных . Для вашего следующего вопроса, пожалуйста, прочитайте Как спросить и обратите внимание на раздел минимального воспроизводимого примера. В частности, в этом вопросе отсутствует исходная структура данных примера. Спасибо.
Спасибо большое, все 3 работают. И спасибо за ваше терпение в помощи и обмене необходимыми ссылками.
Пожалуйста. ТАК способ сказать «спасибо» - это принять (зеленая галочка) и/или проголосовать за ответы, которые вы нашли полезными. Смотрите Что делать, когда кто-то отвечает на мой вопрос
Большое спасибо за ваше подробное объяснение/предложения. Чтобы прояснить имена переменных, я пытаюсь сопоставить имена атрибутов БД здесь. Результат Json из этого кода будет отправлен в мою базу данных через API, вот где я пытаюсь назначить его новое имя переменной. И я здесь новичок, пытаюсь работать со списками, словарями. Я попробовал предложенные вами изменения, первый вариант у меня работает нормально, а второй вариант дает пустые результаты «mdisk»: «» . Третий предлагаемый вариант выдает сообщение: непредвиденная ошибка типа шаблона ({{ mdisk | d([]) + [disk_info]}}) может только конкатенировать str (не \"список\") в str .