2016-11-07 20:58:01 +01:00
#!/usr/bin/env python
# (c) 2016, Julian Barnett <jbarnett@tableau.com>
#
# 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 <http://www.gnu.org/licenses/>.
'''
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 :
2017-01-28 09:12:11 +01:00
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
2016-11-07 20:58:01 +01:00
else :
2017-01-28 09:12:11 +01:00
query = ' SELECT t1.ID, t1.Description, t1.MacAddress, t2.Role FROM ComputerIdentity as t1 join Settings_Roles as t2 on t1.ID = t2.ID '
2016-11-07 20:58:01 +01:00
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 ( )