Ansible 2.9.27:单循环实现多模式正则匹配(支持空格字符串)
Ansible多模式匹配含空格列表项的解决方案(2.9.27版本)
问题根源
你之前的实现报错,是因为直接在with_items中结合regex_search时,带空格的列表项会被模板解析器误拆分为多个参数,导致循环逻辑出错。改用select过滤器配合regex_search可以从列表层面做筛选,避免这个问题。
实现代码
--- - name: 实现类似EGREP的多模式匹配(支持含空格项) hosts: localhost gather_facts: false vars: # 待匹配的目标列表(包含带空格的项) target_items: - "web server log 2024" - "db backup_01" - "api request failed" - "normal task" - "db backup_05" # 多模式正则规则:用|分隔,支持带空格的匹配规则 match_rules: "web server|db backup_[0-9]|request failed" tasks: - name: 筛选符合规则的项 debug: msg: "{{ item }}" loop: "{{ target_items | select('regex_search', match_rules) | list }}"
关键说明
过滤器组合逻辑:
select('regex_search', match_rules)会遍历列表中的每个项,只要项中包含match_rules里任意一个正则模式,就会被保留。- 最后用
list把筛选后的迭代器转为列表,适配loop(2.9版本中loop和with_items都支持)。
正则规则编写:
- 多模式用
|分隔,和EGREP的多模式语法一致。 - 如果规则包含正则特殊字符(如
.、*、?),需要用反斜杠转义,比如要匹配file.log,需写成file\.log。 - 若规则是动态生成的,可以先定义规则列表再拼接:
match_rule_list: - "web server" - "db backup_[0-9]" - "request failed" match_rules: "{{ match_rule_list | join('|') }}"
- 多模式用
精确匹配选项:
如果需要像egrep -x那样整行完全匹配,把regex_search换成regex_match即可。
内容的提问来源于stack exchange,提问作者AKS
相关产品推荐
相关产品推荐

