在 Ansible 中使用社区 XML 模块解析 XML 输出时出现问题

问题描述 投票:0回答:1

我有一个针对防火墙运行的查询的输出字符串。当我尝试使用社区 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 查询中获得更多“未修改”的输出?或者有一种更简单的方法来格式化它以使其更具模块可读性?目标是将分配值和总值作为单独的数字获取。

xml ansible firewall
1个回答
0
投票

看起来您只是忘记将变量名称放在花括号中,因此 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 会将变量“按原样”记录到控制台。 请注意,不会影响内部解释变量值的方式。

© www.soinside.com 2019 - 2024. All rights reserved.