web-dev-qa-db-fra.com

Rejeter dans une variable de liste ansible

J'ai une telle variable:

apps:
 - {name: kapitalism, extension: .war}
 - {name: socialism, extension: .war}
 - {name: somethingelse, extension: .ear}

Et je dois en faire un autre en fonction de celui-ci, ce qui n'inclut pas une partie de la liste. J'essaye ceci:

- name: Reject this please
  set_fact:
    apps: "{{ apps | map(attribute='name') | reject('search',item.name) | list }}"
  when: "item.name.find('socialism') != -1"
  with_items: "{{ apps }}"

Mais ici, j'ai un tel problème que le paramètre d'extension est perdu et que je reçois la variable:

apps: [u'kapitalism', u'somethingelse']

Comment faire une variable comme ceci:

apps:
 - {name: kapitalism, extension: .war}
 - {name: somethingelse, extension: .ear}

?

3
TheDESTROS

Le jeu ci-dessous

  vars:
    apps2: []
    apps:
      - {name: A, extension: .ab}
      - {name: B, extension: .ab}
      - {name: C, extension: .c}

  tasks:
    - set_fact:
        apps2: "{{ apps2 + [ item ] }}"
      loop: "{{ apps }}"
      when: item.name != 'C'
    - debug:
        var: apps2

donne (abrégé):

"apps2": [
    {
        "extension": ".ab", 
        "name": "A"
    }, 
    {
        "extension": ".ab", 
        "name": "B"
    }
]

Le même résultat peut être atteint avec RejectTR (Nouveau dans la version 2.7)

- set_fact:
    apps2: "{{ apps|rejectattr('name', 'match', 'C')|list  }}"
3
Vladimir Botka