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

如何在Ansible角色的when条件中传入字符串列表?

Ansible 按instance_name正则模式匹配运行角色的问题解决

我尝试在Ansible中通过when条件过滤需运行特定角色的清单,要求匹配清单中instance_name的一系列正则模式。

最初使用的配置:

roles:
  - role: DEMO_CHECK
    when: instance_name is match(item)
    loop: "{{ include_list }}"
    vars:
      include_list: 
        - ABC.*XYZ
        - PQR.*TST

运行后出现错误:

'item' is undefined

我还尝试了以下几种写法,均未解决问题:

  • instance_name is match( "{{ item }}" )
  • instance_name is match({{ item }})

问题原因与解决方案

Ansible的角色定义层级不支持直接使用loop,这是导致item未定义的核心原因。正确的做法是利用过滤器集合来判断instance_name是否匹配列表中的任意模式,无需循环。

方案1:使用生成表达式直接判断

roles:
  - role: DEMO_CHECK
    when: instance_name is match(item) for item in include_list
    vars:
      include_list: 
        - ABC.*XYZ
        - PQR.*TST

方案2:使用any()过滤器(更清晰易读)

roles:
  - role: DEMO_CHECK
    when: include_list | map('match', instance_name) | any
    vars:
      include_list: 
        - ABC.*XYZ
        - PQR.*TST
  • map('match', instance_name)会遍历include_list中的每个正则模式,与instance_name执行匹配操作,返回一个布尔值列表
  • any()会检查该布尔列表中是否存在至少一个True,只要有一个模式匹配成功,就会执行该角色

注意:match过滤器是全字符串匹配(要求instance_name完全符合正则模式),如果只需部分匹配(比如字符串中包含该模式片段),请替换为search过滤器。


内容的提问来源于stack exchange,提问作者Prakash Kumar Hansda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:12:11