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

Ansible Tower AWX使用regex_findall过滤器报错如何解决

问题原因
  • 核心差异来自Ansible版本兼容性:Ansible 2.10及以上版本对regex_findall过滤器做了适配,允许直接传入列表类型的变量,会自动对列表内的每一项执行正则匹配后合并结果。而你当前AWX内置的Ansible 2.9.14版本中,regex_findall仅支持传入字符串/字节类的参数,output.stdout_lines本身是行列表类型,直接传入就会抛出类型不匹配的错误。
  • 额外注意:你原正则中的.未转义,会匹配任意字符,存在匹配非IP内容的风险,建议修正为\d+\.\d+\.\d+\.\d+。
解决方案

以下3种方案任选即可,均兼容Ansible 2.9和2.10+版本,输出结果和你本地运行的效果完全一致:

方案1:直接使用stdout字符串变量(最简便)

output.stdout本身就是命令输出的完整字符串,无需拆分行,直接传入过滤器即可:

- set_fact:
    spool_ip_address: "{{ output.stdout | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+') }}"

方案2:将stdout_lines列表拼接为字符串

如果必须使用stdout_lines变量,可以先通过join方法把列表拼接为单个字符串后再匹配:

- set_fact:
    spool_ip_address: "{{ output.stdout_lines | join('\n') | regex_findall('\\d+\\.\\d+\\.\\d+\\.\\d+') }}"

方案3:逐行匹配后合并结果

如果需要逐行匹配避免跨行误判,可以用map过滤器对每一行单独执行匹配后再扁平化结果:

- set_fact:
    spool_ip_address: "{{ output.stdout_lines | map('regex_findall', '\\d+\\.\\d+\\.\\d+\\.\\d+') | flatten }}"

内容的提问来源于stack exchange,提问作者netv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:01