Назад | Перейти на главную страницу

использовать select и map с ansible

У меня есть словарь, и я хотел бы выделить все элементы, имеющие 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