Trying to parse Juniper inventory that looks like this:
<chassis-inventory>
<chassis style="inventory">
<name>Chassis</name>
<serial-number>T8382</serial-number>
<description>MX5-T</description>
<chassis-module>
<name>Midplane</name>
<version>REV 08</version>
<part-number>711-038215</part-number>
<serial-number>ABBZ6152</serial-number>
<description>MX5-T</description>
<clei-code>IPMUA00ARA</clei-code>
<model-number>CHAS-MX5-T-S</model-number>
</chassis-module>
<chassis-module>
<name>PEM 0</name>
<version>Rev 05</version>
<part-number>740-028288</part-number>
<serial-number>WI07395</serial-number>
<description>AC Power Entry Module</description>
<clei-code>COUPAFAEAB</clei-code>
<model-number>PWR-MX80-AC-S</model-number>
</chassis-module>
<chassis-module>
<name>PEM 1</name>
<version>Rev 05</version>
<part-number>740-028288</part-number>
<serial-number>WI07740</serial-number>
<description>AC Power Entry Module</description>
<clei-code>COUPAFAEAB</clei-code>
<model-number>PWR-MX80-AC-S</model-number>
</chassis-module>
<chassis-module>
<name>FPC 0</name>
<part-number>BUILTIN</part-number>
<serial-number>BUILTIN</serial-number>
<description>MPC BUILTIN</description>
<chassis-sub-module>
<name>MIC 0</name>
<part-number>BUILTIN</part-number>
<serial-number>BUILTIN</serial-number>
<description>4x 10GE XFP</description>
<chassis-sub-sub-module>
<name>PIC 0</name>
<part-number>BUILTIN</part-number>
<serial-number>BUILTIN</serial-number>
<description>4x 10GE XFP</description>
</chassis-sub-sub-module>
</chassis-sub-module>
<chassis-sub-module>
<name>MIC 1</name>
<version>REV 18</version>
<part-number>750-043688</part-number>
<serial-number>CADE8507</serial-number>
<description>MS-MIC-16G</description>
<clei-code>COUIBC4BAA</clei-code>
<model-number>MS-MIC-16G</model-number>
<chassis-sub-sub-module>
<name>PIC 2</name>
<part-number>BUILTIN</part-number>
<serial-number>BUILTIN</serial-number>
<description>MS-MIC-16G</description>
</chassis-sub-sub-module>
</chassis-sub-module>
</chassis-module>
</chassis>
</chassis-inventory>
The playbook is simple:
- name: Read XML
set_fact:
parsed_xml_data: "{{ junos_result.stdout | parse_xml('./templates/parse_inventory.yaml') }}"
And the template:
vars:
module:
name: "{{ item.name }}"
serial_number: "{{ item.serial_number }}"
description: "{{ item.description }}"
keys:
dev_inventory:
value: "{{ module }}"
top: 'chassis'
items:
name: "name"
serial_number: "serial-number"
description: "description"
The result of this task gives me chassis attributes as expected:
ok: [lns01.lab] => {
"ansible_facts": {
"parsed_xml_data": {
"dev_inventory": [
{
"description": "MX5-T",
"name": "Chassis",
"serial_number": "T8382"
}
]
}
},
"changed": false
}
But I would like to find all modules and sub-modules, like with 'chassis*' xpath where serial-number is not "BUILTIN". Is there a way to use a wildcard here to match paths with variable length and use a condition to filter out BUILTIN serial numbers?
Here's a minimal (note in particular the complete lack of error checking) filter plugin that does what you want:
If we drop this into
filter_plugins/junos.py, we can write a playbook like this:This will produce output that looks like: