У меня есть словарь, и я хотел бы выделить все элементы, имеющие vg_name == 'vgapplis'
и вычислим сумму их size_FS
. Я пробовал это, но это не работает. Идея ?
- set_fact:
FS_vgapplis:"{{ FS | select(''search'', ''\bvgapplis\b'')| map(attribute='size_FS')|list|sum }}"
Это то, что у меня FS
переменная выглядит как
FS:
- nom_FS: /appm/oracle/product
nom_LV: lv_product
size_FS: 5
owner_FS: oracle
group_FS: dba
vg_name: vgapplis
- nom_FS: /appm/oracle/product/12.1.0.2
nom_LV: lv_12102
size_FS: 15
owner_FS: oracle
group_FS: dba
vg_name: vgapplis
- nom_FS: /apps/oracle/logs
nom_LV: lvlogs
size_FS: 5
owner_FS: oracle
group_FS: dba
vg_name: vglogs
Спасибо
Вы используете select
фильтр ошибочно с довольно странным аргументом (я подозреваю ошибку копирования / вставки, но я не уверен). select
применит тест к каждому объекту в списке. Я не знаю ни одного search
тест, который можно применить к хэш-карте (ближайший, что я могу придумать, - это питон search
метод re
- т.е. regexp- объект, который в любом случае не подходит)
В вашем случае вы ищете конкретное значение атрибута вашей хэш-карты. Это можно сделать с помощью selectattr
фильтр который применит тест к заданному атрибуту объектов в списке и вернет только те, которые прошли тест.
Существует другой подход к вашей проблеме, более компактный IMO с использованием json_query
фильтр
Ниже приведен пример сценария, в котором оба подхода приводят к одному и тому же результату.
---
- name: Sum size of FS
hosts: localhost
gather_facts: false
vars:
FS:
- nom_FS: /appm/oracle/product
nom_LV: lv_product
size_FS: 5
owner_FS: oracle
group_FS: dba
vg_name: vgapplis
- nom_FS: /appm/oracle/product/12.1.0.2
nom_LV: lv_12102
size_FS: 15
owner_FS: oracle
group_FS: dba
vg_name: vgapplis
- nom_FS: /apps/oracle/logs
nom_LV: lvlogs
size_FS: 5
owner_FS: oracle
group_FS: dba
vg_name: vglogs
tasks:
- name: Calculate with selectattr, map and sum
debug:
msg: "{{ FS | selectattr('vg_name', 'equalto', 'vgapplis') | map(attribute='size_FS') | list | sum }}"
- name: Calculate with json_query
vars:
sum_query: "[?vg_name=='vgapplis'].size_FS | sum(@)"
debug:
msg: "{{ FS | json_query(sum_query) }}"
И результат
PLAY [Sum size of FS] ****************************************************************
TASK [Calculate with selectattr, map and sum] ****************************************
ok: [localhost] => {
"msg": "20"
}
TASK [Calculate with json_query] *****************************************************
ok: [localhost] => {
"msg": "20"
}
PLAY RECAP ***************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0