From 2f7983ef12be9fecfe707b9de9a1e5b3a2cbf34c Mon Sep 17 00:00:00 2001 From: jbarnett1981 Date: Mon, 7 Nov 2016 11:58:01 -0800 Subject: [PATCH] Provide MDT Dynamic Inventory script (#18352) * Add files via upload * Update mdt_dynamic_inventory.py Adding maintainer name in docstring fixing deprecated print syntax on a few lines fixing configparser import to support python2 and python3 * Update mdt_dynamic_inventory.py * Update mdt_dynamic_inventory.py Adding --host functionality --- mdt.ini | 17 +++++ mdt_dynamic_inventory.py | 132 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 mdt.ini create mode 100644 mdt_dynamic_inventory.py diff --git a/mdt.ini b/mdt.ini new file mode 100644 index 00000000000..c401c0ce17e --- /dev/null +++ b/mdt.ini @@ -0,0 +1,17 @@ +[mdt] + +# Set the MDT server to connect to +server = localhost.example.com + +# Set the MDT Instance +instance = EXAMPLEINSTANCE + +# Set the MDT database +database = MDTDB + +# Configure login credentials +user = local.domain\admin +password = adminpassword + +[tower] +groupname = mdt diff --git a/mdt_dynamic_inventory.py b/mdt_dynamic_inventory.py new file mode 100644 index 00000000000..7c7c557194c --- /dev/null +++ b/mdt_dynamic_inventory.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python + +# (c) 2016, Julian Barnett +# +# This file is part of Ansible. +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +''' +MDT external inventory script +================================= +author: J Barnett 06/23/2016 01:15 +maintainer: J Barnett (github @jbarnett1981) +''' + +import argparse +import json +import pymssql +try: + import configparser +except ImportError: + import ConfigParser as configparser + +class MDTInventory(object): + + def __init__(self): + ''' Main execution path ''' + self.conn = None + + # Initialize empty inventory + self.inventory = self._empty_inventory() + + # Read CLI arguments + self.read_settings() + self.parse_cli_args() + + # Get Hosts + if self.args.list: + self.get_hosts() + + # Get specific host vars + if self.args.host: + self.get_hosts(self.args.host) + + def _connect(self, query): + ''' + Connect to MDT and dump contents of dbo.ComputerIdentity database + ''' + if not self.conn: + self.conn = pymssql.connect(server=self.mdt_server + "\\" + self.mdt_instance, user=self.mdt_user, password=self.mdt_password, database=self.mdt_database) + cursor = self.conn.cursor() + cursor.execute(query) + self.mdt_dump = cursor.fetchall() + self.conn.close() + + def get_hosts(self, hostname=False): + ''' + Gets host from MDT Database + ''' + if hostname: + query = "SELECT t1.ID, t1.Description, t1.MacAddress, t2.Role FROM ComputerIdentity as t1 join Settings_Roles as t2 on t1.ID = t2.ID where t1.Description = '%s'" % hostname + else: + query = 'SELECT t1.ID, t1.Description, t1.MacAddress, t2.Role FROM ComputerIdentity as t1 join Settings_Roles as t2 on t1.ID = t2.ID' + self._connect(query) + + # Configure to group name configured in Ansible Tower for this inventory + groupname = self.mdt_groupname + + # Initialize empty host list + hostlist = [] + + # Parse through db dump and populate inventory + for hosts in self.mdt_dump: + self.inventory['_meta']['hostvars'][hosts[1]] = {'id': hosts[0], 'name': hosts[1], 'mac': hosts[2], 'role': hosts[3]} + hostlist.append(hosts[1]) + self.inventory[groupname] = hostlist + + # Print it all out + print(json.dumps(self.inventory, indent=2)) + + def _empty_inventory(self): + ''' + Create empty inventory dictionary + ''' + return {"_meta" : {"hostvars" : {}}} + + def read_settings(self): + ''' + Reads the settings from the mdt.ini file + ''' + config = configparser.SafeConfigParser() + config.read('mdt.ini') + + # MDT Server and instance and database + self.mdt_server = config.get('mdt', 'server') + self.mdt_instance = config.get('mdt', 'instance') + self.mdt_database = config.get('mdt', 'database') + + # MDT Login credentials + if config.has_option('mdt', 'user'): + self.mdt_user = config.get('mdt', 'user') + if config.has_option('mdt', 'password'): + self.mdt_password = config.get('mdt', 'password') + + # Group name in Tower + if config.has_option('tower', 'groupname'): + self.mdt_groupname = config.get('tower', 'groupname') + + + def parse_cli_args(self): + ''' + Command line argument processing + ''' + parser = argparse.ArgumentParser(description='Produce an Ansible Inventory file based on MDT') + parser.add_argument('--list', action='store_true', default=False, help='List instances') + parser.add_argument('--host', action='store', help='Get all the variables about a specific instance') + self.args = parser.parse_args() + +if __name__ == "__main__": + # Run the script + MDTInventory()