我有一本字典,我想选择所有具有 的元素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
谢谢
答案1
您正在使用select
筛选错误地使用了相当奇怪的参数(我怀疑是复制/粘贴错误,但我不确定)。select
将对列表中的每个对象应用测试。我不知道任何可以应用于哈希图的测试(我能想到的最接近的是 -ie regexp- 对象的search
python方法,无论如何都不合适)search
re
在您的例子中,您正在寻找哈希图的属性的特定值。这可以通过以下方式完成selectattr
筛选它将对列表中对象的给定属性应用测试,并仅返回通过测试的属性。
有一种解决您问题的方法,在我看来,这种方法更紧凑,使用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