Skip to content

Instantly share code, notes, and snippets.

@jchristi
Created May 24, 2017 20:24
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jchristi/c814d066d57a5d0cae5df5f110e85042 to your computer and use it in GitHub Desktop.
Save jchristi/c814d066d57a5d0cae5df5f110e85042 to your computer and use it in GitHub Desktop.
Custom ansible dynamic inventory that allows a directory of variables to be shared across multiple inventories
#!/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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment