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)