Skip to content

Instantly share code, notes, and snippets.

@Dapacruz
Created August 7, 2020 01:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dapacruz/8926de1e38189a034a07bce0a55c3247 to your computer and use it in GitHub Desktop.
Save Dapacruz/8926de1e38189a034a07bce0a55c3247 to your computer and use it in GitHub Desktop.
Panorama Dynamic Inventory for Ansible Tower
#!/usr/bin/env python2.7
import argparse
import json
import os
import sys
import urllib
import urllib2
import xml.etree.ElementTree as ET
panorama_host = 'HOST.DOMAIN.COM'
domain_name = 'DOMAIN.COM'
panorama_api_token = os.environ["panw_api_token"]
def query_api(host):
# Get connected firewalls
cmd = '<show><devices><connected></connected></devices></show>'
params = urllib.urlencode({
'type': 'op',
'cmd': cmd,
'key': panorama_api_token,
})
url = 'https://{}/api/?{}'.format(host, params)
try:
req = urllib2.Request(url)
xml = urllib2.urlopen(req).read()
except OSError as err:
raise SystemExit('{}: Unable to connect to host ({})'.format(host, err))
return xml
def parse_xml(root):
results = []
for firewall in root.findall('./result/devices/entry'):
try:
hostname = firewall.find("hostname").text.lower()
hostname = '{}.{}'.format(hostname, domain_name)
except AttributeError:
hostname = 'N/A'
results.append(hostname)
return results
def main():
parser = argparse.ArgumentParser(description='Returns a list of firewalls')
parser.add_argument('--host', metavar='', type=str)
parser.add_argument('--list', action='store_true')
args = parser.parse_args()
if args.host:
print(json.dumps({}))
sys.exit(0)
xml = query_api(panorama_host)
try:
root = ET.fromstring(xml)
except TypeError as err:
raise SystemExit('Unable to parse XML! ({})'.format(err))
firewalls = parse_xml(root)
inventory = {
'all': {
'hosts': firewalls,
'vars': {}
}
}
if args.list:
print(json.dumps(inventory))
sys.exit(0)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment