Created
August 7, 2020 01:20
-
-
Save Dapacruz/8926de1e38189a034a07bce0a55c3247 to your computer and use it in GitHub Desktop.
Panorama Dynamic Inventory for Ansible Tower
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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