Ansible List Variable和Select Filter可忽略匹配项



我在一个可解析的剧本中有一个变量dir_lst_raw,其值为列表,如下所示:

"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_的行,并将其作为列表保存到另一个变量。我在谷歌上搜索了regex,并试图不匹配下面的模式和选择过滤器

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

但是新变量CCD_ 3变成了空列表。我期望dir_lst如下:

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

有人能建议我怎么做吗?

Q:"删除所有包含CCD_ 5"的行

A: 您可以使用简单的测试搜索。报价:

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

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

或者您可以使用测试regex。报价:

regex的工作原理类似于搜索,但可以通过传递match_type关键字参数将regex配置为执行其他测试。。。

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

最新更新