2 атрибута
Добавить атрибут выбор к предметам, напр.
- set_fact:
rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'выбор': выбор})] }}"
цикл: "{{ rdm_info }}"
вары:
scsi_controller: "{{ item.scsi_controller.split(',') }}"
unit_number: "{{ item.unit_number.split(',') }}"
выбор: "{{ scsi_controller|
zip (номер_единицы)|
отклонить ('0', 'экв.', '0') }}"
дает
rdm_sel:
- scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
выбор:
- ['1', '2']
- ['1', '0']
- ['1', '1']
- ['2', '0']
- ['2', '1']
- ['3', '0']
- ['3', '1']
- ['3', '14']
- ['3', '15']
unit_number: 0,1,2,0,1,0,1,0,1,14,15
имя_вм: test_vm
Затем повторите with_subelements
- отладка:
сообщение: >-
имя: {{ item.0.vm_name }}
scsi_controller: {{ item.1.0 }}
unit_number: {{ пункт.1.1 }}
with_subelements:
- "{{rdm_sel}}"
- выбор
дает
msg: 'имя: test_vm scsi_controller: 1 unit_number: 2'
msg: 'имя: test_vm scsi_controller: 1 unit_number: 0'
msg: 'имя: test_vm scsi_controller: 1 unit_number: 1'
msg: 'имя: test_vm scsi_controller: 2 unit_number: 0'
msg: 'имя: test_vm scsi_controller: 2 unit_number: 1'
msg: 'имя: test_vm scsi_controller: 3 unit_number: 0'
msg: 'имя: test_vm scsi_controller: 3 unit_number: 1'
msg: 'имя: test_vm scsi_controller: 3 unit_number: 14'
msg: 'имя: test_vm scsi_controller: 3 unit_number: 15'
По желанию добавить все единицы измерения
- set_fact:
rdm_units: "{{ rdm_units|d([]) + [item|объединить({'единицы': единицы})] }}"
цикл: "{{ rdm_info }}"
loop_control:
метка: "{{ item.vm_name }}"
вары:
scsi_controller: "{{ item.scsi_controller.split(',') }}"
unit_number: "{{ item.unit_number.split(',') }}"
единицы: "{{ scsi_controller|zip(unit_number) }}"
дает
rdm_units:
- scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
unit_number: 0,1,2,0,1,0,1,0,1,14,15
единицы измерения:
- ['0', '0']
- ['0', '1']
- ['1', '2']
- ['1', '0']
- ['1', '1']
- ['2', '0']
- ['2', '1']
- ['3', '0']
- ['3', '1']
- ['3', '14']
- ['3', '15']
имя_вм: test_vm
Затем выберите единицы в цикле. Приведенная ниже задача дает тот же результат.
- отладка:
сообщение: >-
имя: {{ item.0.vm_name }}
scsi_controller: {{ item.1.0 }}
unit_number: {{ пункт.1.1 }}
with_subelements:
- "{{ rdm_units }}"
- единицы измерения
когда: элемент 1.0 != '0'
Несколько атрибутов
Ansible не предоставляет вам фильтр для сжатия списка списков. Но вы можете создать очень простой настраиваемый фильтр, например
оболочка> cat filter_plugins/zip2.py
защита zip2(l):
обратный почтовый индекс (* л)
класс FilterModule (объект):
деф фильтры(я):
возвращаться {
'zip2': zip2,
}
Теперь создайте список атрибутов (_keys), извлекать струны, расколоть предметы, и присоединиться аргументы для фильтра zip2. Затем создайте выбор От всех _keys. Например, учитывая упрощенные данные для тестирования
rdm_info:
- х: 0,2,3
у: 4,5,6
г: 7,8,9
н: А
- х: 1,0,3
у: 4,5,6
г: 7,8,9
н: Б
- х: 1,2,0
у: 4,5,6
г: 7,8,9
н: С
задание ниже
- set_fact:
rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'выбор': выбор})] }}"
цикл: "{{ rdm_info }}"
вары:
_keys: [х, у, г]
_args: "{{ _keys|map('extract', item)|map('split', ',')|join(',') }}"
выбор: "{{ _args|zip2|rejectattr('0', 'eq', '0') }}"
дает
rdm_sel:
- н: А
выбор:
- ['2', '5', '8']
- ['3', '6', '9']
х: 0,2,3
у: 4,5,6
г: 7,8,9
- н: Б
выбор:
- ['1', '4', '7']
- ['3', '6', '9']
х: 1,0,3
у: 4,5,6
г: 7,8,9
- н: С
выбор:
- ['1', '4', '7']
- ['2', '5', '8']
х: 1,2,0
у: 4,5,6
г: 7,8,9