Hellseher
Hellseher

Reputation: 286

How to reduce a list against another list of patterns?

I need to write with Ansible's built in filters and tests the similar logic of shell one-liner:

for path in $(find PATH_TO_DIR); do for pattern in $PATTERNS; do echo $path | grep -v $pattern; done; done 
---
- hosts: localhost
  connection: local
  gather_facts: False

  vars:
    paths:
      - "/home/vagrant/.ansible"
      - path-one
      - path-two
      - path-three
      - "/home/vagrant/.ssh"
      - "/home/vagratn/"
    patterns:
      - ".*ssh.*"
      - ".*ansible.*"
      - ".*one.*"

  tasks:
    - name: set empty list
      set_fact:
        files_to_be_removed: [  ]

In the end I would like to have a list like this:

ok: [localhost] => {
    "msg": [
        "path-two",
        "path-three",
        "/home/vagratn/"
    ]
}

With this form I getting a list where only last item from patterns is applied.

    - set_fact:
        files_to_be_removed: |
          {{ paths
          |reject("search", item)
          |list }}
      with_items:
        - "{{ patterns }}"

Upvotes: 0

Views: 149

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67984

The tasks below do the job

    - set_fact:
        files_to_be_removed: "{{ paths }}"
    - set_fact:
        files_to_be_removed: "{{ files_to_be_removed|
                                 reject('search', item)|
                                 list }}"
      loop: "{{ patterns }}"
    - debug:
        var: files_to_be_removed

give

    "files_to_be_removed": [
        "path-two", 
        "path-three", 
        "/home/vagratn/"
    ]

Upvotes: 1

Related Questions