Ansible以字符串形式读取xml的一部分-而不是dict / list

时间:2018-11-09 23:00:36

标签: xml ansible

我有以下提到的xml:

<?xml version='1.0' encoding='UTF-8'?>`  
<Envelope>  
  <Body>  
    <response>  
      <timestamp>2018-11-01T15:18:44-04:00</timestamp>  
      <content>`  
        <element1>value1</element1>  
        <element2>value2(/element2>  
        <element3>  
          <child1>c1</child1>  
          <child2>c2</child2>  
        </element3>  
      </content>  
    </response>  
  </Body>  
</Envelope>  

我必须捕获xml格式的content标记子代才能对其进行编码。

当我使用xml模块获取内容及其后代时,将其捕获为词典列表。

我想要做的就是将content捕获为

之类的字符串
"<element1>value1</element1>  
 <element2>value2(/element2>  
 <element3>  
      <child1>c1</child1>  
      <child2>c2</child2>  
 </element3>"

作为字符串。
稍后,我将使用此字符串进行编码和解码。

我不想对content的每个后代进行编码,而是对所有content进行编码。

如何使用ansible实现此目的。 我正在使用ansible 2.4版

2 个答案:

答案 0 :(得分:0)

基于阅读Ansible xml module,这似乎是不可能的。

您可以通过command之类的实用程序来使用xmllint模块,如下所示:

---
- name: run the playbook tasks on the localhost
  hosts: 127.0.0.1
  connection: local
  tasks:
  - name: Get Content Section
    command: "xmllint --xpath '/Envelope/Body/response/content' --format test.xml"
    register: out

  - name: output
    debug:
      msg: "{{ out.stdout }}"

看起来像这样:

PLAY [run the playbook tasks on the localhost] ***************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [127.0.0.1]

TASK [Get Content Section] ***********************************************************************************************************************
changed: [127.0.0.1]

TASK [output] ************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "<content><element1>value1</element1><element2>value2</element2><element3><child1>c1</child1><child2>c2</child2></element3></content>"
}

PLAY RECAP     ***************************************************************************************************************************************
127.0.0.1                  : ok=3    changed=1    unreachable=0    failed=0

答案 1 :(得分:0)

您可以利用以下事实,即使用xml: target python也必须可用(并且安装了lxml蛋/滚轮,但我们不会这样做)为此不需要它):

  vars:
    name_of_the_xml_file: whatever-filename
  tasks:
  - command: '{{ ansible_python_interpreter }} -u - {{ name_of_the_xml_file }}'
    args:
      stdin: |
        import sys
        from xml.etree.ElementTree import parse, tostring
        with open(sys.argv[1]) as fh:
            doc = parse(fh)
        c = doc.find('.//content')
        print(tostring(c))
    register: the_content
  - debug: var=the_content.stdout