|
#!/usr/bin/env python |
|
|
|
import os |
|
import six |
|
import argparse |
|
|
|
from six.moves import configparser |
|
|
|
from ansible.parsing.dataloader import DataLoader |
|
from ansible.inventory import Inventory |
|
from ansible.vars import VariableManager |
|
|
|
try: |
|
import json |
|
except ImportError: |
|
import simplejson as json |
|
|
|
|
|
class SharedStaticInventory(object): |
|
|
|
def _empty_inventory(self): |
|
return {"_meta" : {"hostvars" : {}}} |
|
|
|
def __init__(self): |
|
''' Main execution path ''' |
|
self.inventory = self._empty_inventory() |
|
self.shared_dir = os.path.realpath('../shared') |
|
|
|
# Read settings |
|
self.read_settings() |
|
|
|
loader = DataLoader() |
|
variable_manager = VariableManager() |
|
self.shared_inventory = Inventory(loader=loader, variable_manager=variable_manager, |
|
host_list=self.shared_dir) |
|
variable_manager.set_inventory(self.shared_inventory) |
|
group_vars_files = variable_manager._group_vars_files |
|
|
|
for group_name, group_vars in group_vars_files.iteritems(): |
|
self.inventory[group_name] = {'vars' : group_vars[0]} |
|
|
|
data_to_print = self.json_format_dict(self.inventory, pretty=True) |
|
print(data_to_print) |
|
|
|
def read_settings(self): |
|
''' Reads the settings from the shared.ini file ''' |
|
scriptbasename = os.path.basename(__file__) |
|
scriptbasename = scriptbasename.replace('.py', '') |
|
|
|
defaults = {'shared': { |
|
'ini_path': os.path.join(os.path.dirname(__file__), '%s.ini' % scriptbasename) |
|
} |
|
} |
|
|
|
if six.PY3: |
|
config = configparser.ConfigParser() |
|
else: |
|
config = configparser.SafeConfigParser() |
|
ini_path = os.environ.get('SHARED_INI_PATH', defaults['shared']['ini_path']) |
|
ini_path = os.path.expanduser(os.path.expandvars(ini_path)) |
|
ini_dir = os.path.realpath(os.path.dirname(ini_path)) |
|
config.read(ini_path) |
|
|
|
# Get path of shared inventory |
|
if config.has_option('shared', 'path'): |
|
shared_dir = config.get('shared', 'path') |
|
if shared_dir[0] != '/': |
|
shared_dir = '{}/{}'.format(ini_dir, shared_dir) |
|
self.shared_dir = shared_dir |
|
|
|
def json_format_dict(self, data, pretty=False): |
|
''' Converts a dict to a JSON object and dumps it as a formatted string ''' |
|
if pretty: |
|
return json.dumps(data, sort_keys=True, indent=2) |
|
else: |
|
return json.dumps(data) |
|
|
|
|
|
if __name__ == '__main__': |
|
# Run the script |
|
SharedStaticInventory() |