我在 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"
]
有人可以建议我如何完成它吗?
问:“删除所有包含
.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