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

问题描述 投票:0回答:1

我在 ansible playbook 中有一个变量

dir_lst_raw
,其值为 list,如下所示:

"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"
      ]

我需要删除所有包含

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

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

但是新变量

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

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path2/dir2/dir3/somefile"
     ]

有人可以建议我如何完成它吗?

regex ansible ninja ansible-filter
1个回答
11
投票

问:“删除所有包含

.ansible_backup_
的行”

A:您可以使用简单的 test search。引用:

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

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

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

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

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

两个选项给出相同的结果

  dir_lst:
    - /path1/dir1/user
    - /path2/dir2/admin
    - /path2/dir2/dir3/somefile

用于测试的完整剧本示例

- 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
© www.soinside.com 2019 - 2024. All rights reserved.