Ansible使用regex_findall从XML解析IP地址遇语法错误
解决Ansible中regex_findall的YAML转义语法错误问题
我懂你碰到的糟心事了——在Ansible剧本里用regex_findall从XML结果提取IP地址时,因为YAML的转义规则触发了语法报错,哪怕手动转义反斜杠也没用对吧?这其实是YAML和Jinja2的字符串解析规则冲突导致的,下面给你几个靠谱的解决办法:
问题根源
YAML会自动解析字符串中的反斜杠作为转义字符,而你正则里的\b(单词边界)、\.(点的转义)这些元字符,会被YAML当成未知的转义序列,直接抛出语法错误。
解决方案
1. 使用Jinja2原始字符串前缀r(最推荐)
给正则表达式加上r前缀,让Jinja2把它当作原始字符串处理,这样里面的反斜杠不会被YAML或者Jinja2转义,直接传递给regex_findall:
- name: Parse XML result for IP Address set_fact: returned_ipaddress: "{{ request_devices | regex_findall(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') }}"
2. 用单引号包裹正则表达式
YAML对单引号内的字符串不会做任何转义处理,所以把整个正则放在单引号里,也能避免转义问题:
- name: Parse XML result for IP Address set_fact: returned_ipaddress: "{{ request_devices | regex_findall('\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') }}"
3. 在双引号中双重转义反斜杠
如果你习惯用双引号,那就把每个反斜杠都写成两个(\\),这样YAML解析后会保留一个反斜杠给正则使用:
- name: Parse XML result for IP Address set_fact: returned_ipaddress: "{{ request_devices | regex_findall('\\b(?:[0-9]{1,3}\\.{3}[0-9]{1,3}\\b') }}"
不过这种写法容易出错,尤其是正则比较复杂的时候,不太推荐。
额外建议
可以先加个debug模块确认下request_devices里的XML内容是否符合预期,避免因为源数据问题导致提取失败:
- name: Debug XML response debug: var: request_devices
内容的提问来源于stack exchange,提问作者rsaturns
相关产品推荐
相关产品推荐

