Ansible 列表变量和选择过滤器以忽略匹配的项目

Vij*_*esh 2 regex ansible ninja ansible-filter

dir_lst_raw我在 ansible playbook 中有一个变量,其值是一个列表,如下所示:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path3/dir3/user.ansible_backup_2020-03-16",
        "/path1/dir1/config.ansible_backup_2020-03-16",
        "/path2/dir2/dir3/somefile"
      ]
Run Code Online (Sandbox Code Playgroud)

我需要删除包含的所有行并将其作为列表.ansible_backup_保存到另一个变量中。我在谷歌上搜索了正则表达式,并尝试将模式与选择过滤器不匹配,如下所示:

  - set_fact:
      dir_lst: "{{ dir_lst_flt_r | select('match','(^.ansible_backup_)+') | list }}"
Run Code Online (Sandbox Code Playgroud)

但新变量dir_lst结果是一个空列表。我期待dir_lst如下:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path2/dir2/dir3/somefile"
     ]
Run Code Online (Sandbox Code Playgroud)

有人可以建议我怎样才能完成它吗?

Vla*_*tka 10

问: “删除所有包含的行.ansible_backup_

答:您可以使用简单的测试 搜索。引用:

如果在字符串中的任何位置找到该模式,则搜索成功。

  dir_lst: "{{ dir_lst_raw|reject('search', dir_lst_search)|list }}"
  dir_lst_search: '\.ansible_backup_'
Run Code Online (Sandbox Code Playgroud)

或者您可以使用测试 正则表达式。引用:

正则表达式的工作方式类似于搜索,但也可以通过传递 match_type 关键字参数来配置正则表达式来执行其他测试...

  dir_lst: "{{ dir_lst_raw|reject('regex', dir_lst_regex)|list }}"
  dir_lst_regex: '^(.*)\.ansible_backup_(.*)$'
Run Code Online (Sandbox Code Playgroud)

两个选项给出相同的结果

  dir_lst:
    - /path1/dir1/user
    - /path2/dir2/admin
    - /path2/dir2/dir3/somefile
Run Code Online (Sandbox Code Playgroud)

用于测试的完整剧本示例

- hosts: localhost

  vars:

    dir_lst_raw:
      - /path1/dir1/user
      - /path2/dir2/admin
      - /path3/dir3/user.ansible_backup_2020-03-16
      - /path1/dir1/config.ansible_backup_2020-03-16
      - /path2/dir2/dir3/somefile

    dir_lst1: "{{ dir_lst_raw|reject('search', dir_lst_search)|list }}"
    dir_lst_search: '\.ansible_backup_'

    dir_lst2: "{{ dir_lst_raw|reject('regex', dir_lst_regex)|list }}"
    dir_lst_regex: '^(.*)\.ansible_backup_(.*)$'

  tasks:

    - debug:
        var: dir_lst1
    - debug:
        var: dir_lst2
Run Code Online (Sandbox Code Playgroud)