You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中使用selectattr同时匹配多个字符串

合并Ansible中两个selectattr的筛选逻辑

你当前通过两次selectattr实现了筛选字典列表中name属性同时包含unique_string1和unique_string2的项,确实可以合并为一次筛选操作,下面提供两种可行方案:

方案一:使用正则正向预查

正则中的AND逻辑不能直接拼接AND,需要用正向预查来实现同时匹配多个字符串的需求。修改后的代码如下:

- set_fact:
    myvar: "{{ list.objects | selectattr('name', 'search', '(?=.*' ~ unique_string1 ~ ')(?=.*' ~ unique_string2 ~ ')') | map(attribute='name') | last }}"
  vars:
    unique_string1: "yes"
    unique_string2: "no"

正则说明

  • (?=.*{{unique_string1}}):正向预查,确保目标字符串中包含unique_string1,.*匹配任意长度的任意字符
  • (?=.*{{unique_string2}}):同理,确保目标字符串中包含unique_string2
  • 该正则不限制两个字符串的出现顺序

方案二:使用select结合条件判断

如果不想用正则,也可以直接用select过滤器,通过自定义条件判断实现同时匹配,可读性更强:

- set_fact:
    myvar: "{{ list.objects | select( item => item.name is search(unique_string1) and item.name is search(unique_string2) ) | map(attribute='name') | last }}"
  vars:
    unique_string1: "yes"
    unique_string2: "no"

逻辑说明

  • select( item => ... ):遍历list.objects中的每个项,执行自定义判断逻辑
  • item.name is search(unique_string1) and item.name is search(unique_string2):直接判断当前项的name同时包含两个目标字符串

两种方案都能实现和原代码相同的效果,可根据自身对正则的熟悉程度选择。

内容的提问来源于stack exchange,提问作者N. J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:45:10