diff --git a/plugins/inventory/ec2.py b/plugins/inventory/ec2.py index 08c37c065e5..3d8a40c5023 100755 --- a/plugins/inventory/ec2.py +++ b/plugins/inventory/ec2.py @@ -115,6 +115,7 @@ import re from time import time import boto from boto import ec2 +from boto import rds import ConfigParser try: @@ -227,6 +228,7 @@ class Ec2Inventory(object): for region in self.regions: self.get_instances_by_region(region) + self.get_rds_instances_by_region(region) self.write_to_cache(self.inventory, self.cache_path_cache) self.write_to_cache(self.index, self.cache_path_index) @@ -254,6 +256,20 @@ class Ec2Inventory(object): print e sys.exit(1) + def get_rds_instances_by_region(self, region): + ''' Makes an AWS API call to the list of RDS instances in a particular + region ''' + + try: + conn = rds.connect_to_region(region) + if conn: + instances = conn.get_all_dbinstances() + for instance in instances: + self.add_rds_instance(instance, region) + except boto.exception.BotoServerError as e: + print "Looks like AWS RDS is down: " + print e + sys.exit(1) def get_instance(self, region, instance_id): ''' Gets details about a specific instance ''' @@ -322,6 +338,56 @@ class Ec2Inventory(object): self.push(self.inventory, key, dest) + def add_rds_instance(self, instance, region): + ''' Adds an RDS instance to the inventory and index, as long as it is + addressable ''' + + # Only want available instances + if instance.status != 'available': + return + + # Select the best destination address + #if instance.subnet_id: + #dest = getattr(instance, self.vpc_destination_variable) + #else: + #dest = getattr(instance, self.destination_variable) + dest = instance.endpoint[0] + + if not dest: + # Skip instances we cannot address (e.g. private VPC subnet) + return + + # Add to index + self.index[dest] = [region, instance.id] + + # Inventory: Group by instance ID (always a group of 1) + self.inventory[instance.id] = [dest] + + # Inventory: Group by region + self.push(self.inventory, region, dest) + + # Inventory: Group by availability zone + self.push(self.inventory, instance.availability_zone, dest) + + # Inventory: Group by instance type + self.push(self.inventory, self.to_safe('type_' + instance.instance_class), dest) + + # Inventory: Group by security group + try: + key = self.to_safe("security_group_" + instance.security_group.name) + self.push(self.inventory, key, dest) + except AttributeError: + print 'Package boto seems a bit older.' + print 'Please upgrade boto >= 2.3.0.' + sys.exit(1) + + # Inventory: Group by engine + self.push(self.inventory, self.to_safe("rds_" + instance.engine), dest) + + # Inventory: Group by parameter group + self.push(self.inventory, self.to_safe("rds_parameter_group_" + instance.parameter_group), dest) + + def get_host_info(self): ''' Get variables about a specific host '''