Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@badstreff
Created February 13, 2017 20:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save badstreff/0af3f881de162182eaaff406ce7a7f0d to your computer and use it in GitHub Desktop.
Save badstreff/0af3f881de162182eaaff406ce7a7f0d to your computer and use it in GitHub Desktop.
#!/usr/local/bin/python3
"""
Custom inventory script for Ansible populated by the JSS
"""
from os.path import dirname, realpath, join
from urllib.parse import quote
import argparse
import json
import configparser
import requests
# import pprint
class JSS:
def __init__(self, url, username, password):
self.url = url
self.username = username
self.password = password
def get_all_computers(self):
req = requests.get(self.url + '/JSSResource/computers',
auth=(self.username, self.password),
headers={'Accept': 'application/json'})
if req.status_code == 200:
return json.loads(req.content.decode('utf-8'))
return None
def get_computer(self, id=None, name=None):
if id:
url = (self.url +
'/JSSResource/computers/id/' +
str(id))
else:
url = (self.url +
'/JSSResource/computers/name/' +
quote(name))
req = requests.get(url,
auth=(self.username, self.password),
headers={'Accept': 'application/json'})
if req.status_code == 200:
return json.loads(req.content.decode('utf-8'))
return None
def get_all_computergroups(self):
req = requests.get(self.url + '/JSSResource/computergroups',
auth=(self.username, self.password),
headers={'Accept': 'application/json'})
if req.status_code == 200:
return json.loads(req.content.decode('utf-8'))
return None
def get_computergroup(self, id=None, name=None):
if id:
url = (self.url +
'/JSSResource/computergroups/id/' +
str(id))
else:
url = (self.url +
'/JSSResource/computergroups/name/' +
quote(name))
req = requests.get(url,
auth=(self.username, self.password),
headers={'Accept': 'application/json'})
if req.status_code == 200:
return json.loads(req.content.decode('utf-8'))
return None
# Empty inventory for testing.
def empty_inventory():
return {'_meta': {'hostvars': {}}}
def main(args=None):
# pp = pprint.PrettyPrinter(indent=2)
mypath = dirname(realpath(__file__))
config = read_jss_config(join(dirname(mypath),
'private/jss.conf'),
'JSS')
jss = JSS(config['url'],
config['api'][0],
config['api'][1])
all = jss.get_all_computers()
if args.host:
print(json.dumps(empty_inventory()))
exit(0)
computers = [x['name'] for x in all['computers']]
ret = {'all': computers,
'_meta': {'hostvars': {}}}
for group in jss.get_all_computergroups()['computer_groups']:
# print(jss.get_computergroup(id=group['id']))
group = jss.get_computergroup(id=group['id'])
name = group['computer_group']['name'].replace(' ', '_')
ret[name] = []
for computer in group['computer_group']['computers']:
ret[name].append(computer['name'])
# for computer in computers:
# data = jss.get_computer(name=computer)
# ret['_meta']['hostvars'][computer] = data
print(json.dumps(ret))
def read_jss_config(path, section):
'''Read the jss config and return a dictionary containing the proper settings
:path - Full path to the config file
:section - Section name that contains the JSS info
'''
config = configparser.ConfigParser()
config.read(path)
return {'url': config.get(section, 'URL'),
'api': (config.get(section, 'username'),
config.get(section, 'password')),
'repo': (config.get(section, 'repo_rw_username'),
config.get(section, 'repo_rw_password'),
config.get(section, 'repo_name'),
config.get(section, 'repo_mount_point'))}
if __name__ == '__main__':
PARSER = argparse.ArgumentParser()
PARSER.add_argument('--host', action='store')
PARSER.add_argument('--list', action='store_true')
main(PARSER.parse_args())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment