In [8]:
import yaml
class Inventory(object):
    def __init__(self, config_file):
        self.raw = yaml.load(open(config_file))
        self._denormalize_()

    def get_instances(self, cluster=None, facet=None, index=None):

        # TODO : Validate if the facet/cluster/index exists
        instances = self.instances
        if cluster:
            instances = [k for k in instances if k['cluster'] == cluster]
        if facet:
            instances = [k for k in instances if k['facet'] == facet]
        if index:
            instances = [k for k in instances if k['index'] == index]
        
        return instances

    def get_security_groups(self, name='.'):
        return [i for i in self.groups if i['name'].find(name)]

    def _denormalize_(self):
        self.instances = []

        for cluster in self.raw['clusters']:
            facets = self.raw['clusters'][cluster]['facets'];
            for facet in facets:
                count = self.raw['clusters'][cluster]['facets'][facet]['count']
                for index in xrange(count):
                    name = "%s-%s-%s-%s"%(self.raw['env'],cluster,facet,index)

                    details = {}
                    details['name'] = name

                    # Add env/cluster level data
                    details['env']= self.raw['env']
                    details['cluster'] = cluster
                    details['facet']= facet
                    details['index']=index
                    details['image']= self.raw['image']
                    details['vpc']=self.raw['vpc']

                    # Add facet data
                    details.update(self.raw['clusters'][cluster]['facets'][facet])

                    # Add security data
                    if not details.has_key('security'):
                        details['security'] = []
                    details['security'].append('default')

                    self.instances.append( details)

        
        self.groups = []
        for group in self.raw['security']:
            for protocol in self.raw['security'][group]:
                for rule in self.raw['security'][group][protocol]:
                    details = {}
                    details['name'] = "%s-%s"%(self.raw['env'], group)
                    details['protocol'] = protocol
                    details[ 'cidr'] = rule
                    details[ 'start'] = self.raw['security'][group][protocol][rule][0]
                    details['end'] = self.raw['security'][group][protocol][rule][1]

                    self.groups.append(details)

In [9]:
i = Inventory('/Users/sa/code/ansible-baby-steps/sandbox.yaml')

In [17]:
i.get_instances(index=0)


Out[17]:
[{'cluster': 'cnc',
  'count': 1,
  'env': 'sandbox',
  'facet': 'nfs',
  'image': 'ami-fa9cf1ca',
  'index': 0,
  'name': 'sandbox-cnc-nfs-0',
  'security': ['web', 'default'],
  'type': 'm1.large',
  'volume': 20,
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'cnc',
  'count': 1,
  'env': 'sandbox',
  'facet': 'monitoring',
  'image': 'ami-fa9cf1ca',
  'index': 0,
  'name': 'sandbox-cnc-monitoring-0',
  'security': ['default'],
  'type': 'm1.large',
  'volume': 10,
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'cnc',
  'count': 1,
  'env': 'sandbox',
  'facet': 'logging',
  'image': 'ami-fa9cf1ca',
  'index': 0,
  'name': 'sandbox-cnc-logging-0',
  'security': ['default'],
  'type': 'm1.large',
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'es',
  'count': 3,
  'env': 'sandbox',
  'facet': 'search',
  'image': 'ami-fa9cf1ca',
  'index': 0,
  'name': 'sandbox-es-search-0',
  'security': ['default'],
  'type': 'm1.large',
  'volume': '100GB',
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'es',
  'count': 3,
  'env': 'sandbox',
  'facet': 'search',
  'image': 'ami-fa9cf1ca',
  'index': 1,
  'name': 'sandbox-es-search-1',
  'security': ['default'],
  'type': 'm1.large',
  'volume': '100GB',
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'es',
  'count': 3,
  'env': 'sandbox',
  'facet': 'search',
  'image': 'ami-fa9cf1ca',
  'index': 2,
  'name': 'sandbox-es-search-2',
  'security': ['default'],
  'type': 'm1.large',
  'volume': '100GB',
  'vpc': 'vpc-1f46ac74'},
 {'cluster': 'es',
  'count': 1,
  'env': 'sandbox',
  'facet': 'backup',
  'image': 'ami-fa9cf1ca',
  'index': 0,
  'name': 'sandbox-es-backup-0',
  'security': ['default'],
  'type': 'm1.large',
  'volume': '100GB',
  'vpc': 'vpc-1f46ac74'}]

In [ ]: