Adding a nested xml element using ansible xml module fails

2,433 views
Skip to first unread message

Uvindra Dias Jayasinha

unread,
Mar 28, 2018, 1:26:14 AM3/28/18
to Ansible Project
Im using Ansible 2.5 on Ubuntu 17.10

Given the following xml file

<business>
  <beers>
  </beers>
</business>


Trying to add nested elements so that the file is changed to the following output fails.

<business>
  <beers>
    <beer>
        <name>Old Rasputin</name>
        <year>2000</year>
    </beer>
  </beers>
</business>


Here is the playbook I used

- name: Add several more beers with the year of manufacture nested
  xml:
    path: /foo/bar.xml
    xpath: /business/beers
    add_children:
    - beer: 
      - name: Old Rasputin
      - year: 2000


I see the following exception,

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: Argument must be bytes or unicode, got 'list' fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n File \"/tmp/ansible_sv9JSC/ansible_module_xml.py\",
line 860, in <module>\n main()\n File \"/tmp/ansible_sv9JSC/ansible_module_xml.py\", line 840, in main\n
add_target_children(module, doc, xpath, namespaces, add_children, input_type)\n File \"/tmp/ansible_sv9JSC/ansible_module_xml.py\", line 409, in add_target_children\n
new_kids = children_to_nodes(module, children, in_type)\n File \"/tmp/ansible_sv9JSC/ansible_module_xml.py\", line 651, in children_to_nodes\n
return [child_to_element(module, child, type) for child in children]\n File \"/tmp/ansible_sv9JSC/ansible_module_xml.py\", line 639, in child_to_element\n
node.text = value\n File \"src/lxml/etree.pyx\", line 1030, in lxml.etree._Element.text.__set__\n File \"src/lxml/apihelpers.pxi\", line 716, in lxml.etree._setNodeText\n
File \"src/lxml/apihelpers.pxi\", line 704, in lxml.etree._createTextNode\n File \"src/lxml/apihelpers.pxi\", line 1442, in lxml.etree._utf8\nTypeError: Argument must be bytes or unicode, got 'list'\n",
"module_stdout": "", "msg": "MODULE FAILURE", "rc": 1}

Is this supported or am I missing something here?


Kai Stian Olstad

unread,
Mar 28, 2018, 9:06:58 AM3/28/18
to ansible...@googlegroups.com
To my knowledge you can't create children's children in one task.
You need to create beer first in one task and then name and year in a separate task.

--
Kai Stian Olstad

Uvindra Dias Jayasinha

unread,
Mar 30, 2018, 12:55:21 AM3/30/18
to Ansible Project
Thanks Kai

Aliaa Yusuf

unread,
Apr 22, 2019, 11:46:32 AM4/22/19
to Ansible Project

Aliaa Yusuf

unread,
Apr 22, 2019, 11:47:52 AM4/22/19
to Ansible Project

Hasini P

unread,
Sep 16, 2021, 9:12:52 AM9/16/21
to Ansible Project
Like add_children, is there a solution for deletion of elements based on element value (elements with no attributes )

- name: Delete several beers with value

  xml:
    path: /foo/bar.xml
    xpath: /business/beers
    value: Old Rasputin
    state: absent

--------------------- Actually I am trying to delete an element in xml file with namespaces
Reply all
Reply to author
Forward
0 new messages