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
相关产品推荐
相关产品推荐

