我有一个针对防火墙运行的查询的输出字符串。当我尝试使用社区 XML 模块解析字符串时,我得到以下输出:
致命:[主机名]:失败! => {“changed”:false,“msg”:“解析文档时出错:xml_string(需要开始标记,'<' not found, line 1, column 1 (
,第1行)”}
来自:
- name: Gather allocated number of addresses for LAN interface...
community.general.xml:
xmlstring: ethernet1-1_output.content
xpath: "/x:response/x:result/x:interface[@name='allocated']"
register: allocated_ethernet1-1
我已经调试了我的输入,根据 VS.Code,它似乎是有效的 XML。但我认为 Ansible 添加了一些额外的字符,这可能会给它带来问题。
<response status=\"success\">
<result>
<interface name=\"ethernet1/1\" id=\"258\" allocated=\"40\" total=\"150\">
<entry name=\"10.10.10.10\">\n
有没有办法从 API 查询中获得更多“未修改”的输出?或者有一种更简单的方法来格式化它以使其更具模块可读性?目标是将分配值和总值作为单独的数字获取。
看起来您只是忘记将变量名称放在花括号中,因此 Ansible 将
ethernet1-1_output.content
解释为字符串。您应该改用 Jinja2 模板:
- name: Gather allocated number of addresses for LAN interface...
community.general.xml:
xmlstring: "{{ ethernet1-1_output.content }}"
xpath: "/x:response/x:result/x:interface[@name='allocated']"
register: allocated_ethernet1-1
但是我认为 Ansible 添加了一些额外的字符,这可能会给它带来问题。
Ansible 不会添加任何额外的字符。您发布的输出可能是从
debug
任务控制台输出复制的,不是吗?默认情况下,Ansible 将任务执行结果输出为 JSON,因此任何双引号或控制字符都应该被转义。为了获得更易于理解的控制台输出,您可以使用 [community.general.yaml
][1] stdout 回调或设置 [callback_result_format = yaml
][2] 作为默认回调(请注意,这两个选项不相等):
; ansible.cfg
[defaults]
callback_result_format = yaml
stdout_callback = community.general.yaml
使用这些,Ansible 会将变量“按原样”记录到控制台。 请注意,不会影响内部解释变量值的方式。