-
-
Save benbramley/df51c2548ff8ceeafa5b to your computer and use it in GitHub Desktop.
| from ansible import utils, errors | |
| import os | |
| import xml.etree.ElementTree as etree | |
| class LookupModule(object): | |
| def __init__(self, basedir=None, **kwargs): | |
| self.basedir = basedir | |
| def tostr(self, node): | |
| if isinstance(node, etree._Element): | |
| if len(node.getchildren()) == 0: | |
| return node.text | |
| return etree.tostring(node) | |
| return str(node) | |
| def read_xml(self, filename, dflt=None, xpath=None): | |
| try: | |
| xmlreader = etree.parse(filename) | |
| nodes = xmlreader.findall(xpath) | |
| values = [self.tostr(node) for node in nodes] | |
| return values | |
| except Exception, e: | |
| raise errors.AnsibleError("xmlfile: %s" % str(e)) | |
| return dflt | |
| def run(self, terms, inject=None, **kwargs): | |
| terms = utils.listify_lookup_plugin_terms(terms, self.basedir, inject) | |
| if isinstance(terms, basestring): | |
| terms = [ terms ] | |
| ret = [] | |
| for term in terms: | |
| params = term.split() | |
| key = params[0] | |
| paramvals = { | |
| 'file' : 'ansible.xml', | |
| 'default' : None, | |
| 'xpath' : None, | |
| } | |
| # parameters specified? | |
| try: | |
| for param in params: | |
| name, value = param.split('=') | |
| assert(name in paramvals) | |
| paramvals[name] = value | |
| except (ValueError, AssertionError), e: | |
| raise errors.AnsibleError(e) | |
| path = utils.path_dwim(self.basedir, paramvals['file']) | |
| var = self.read_xml(path, paramvals['default'], paramvals['xpath']) | |
| if var is not None: | |
| if type(var) is list: | |
| for v in var: | |
| ret.append(v) | |
| else: | |
| ret.append(var) | |
| return ret |
Reminder for anyone else coming across this:
Lookups occur on the local computer, not on the remote computer.
If you're looking for a way to retrieve XML values from the remote side, the best available thing at this time seems to be RHInception's ansible-xml module (although value lookup is neither explicitly documented nor necessarily actually supported yet).
Update, that issue @Lx linked 404's now. Here's the updated URL: cmprescott/ansible-xml#14
This is very nice, any example how can we take a specific attribute or value from the xml?
EG <Site Name="MySite"> Loading time</>
We would like to get the site name.
Thank you!
You wouldn't happen to have a version that is compatible with version 2.0 of Ansible would you?
I created a version for Ansible 2.0 based off of yours that should function the same: https://gist.github.com/danieldbower/7b34c45ad5e39576e2e5
in case some one want to perform lookup using ansible-xml
- name: playing with ansible xml
xml:
path: /root/akhil/config.xml
xpath: //name[text()='hive.cli.print.header']/../value
content: text
register: header_value
- name: debug hits
debug:
msg: "var hits = {{ header_value.matches[0].value }}"
reference - https://github.com/ansible/ansible/blob/devel/lib/ansible/modules/files/xml.py#L181
Example usage: