Update ec2 inventory from core.

This commit is contained in:
Chris Church
2015-06-09 14:53:31 -04:00
parent 3573a164e7
commit 58207b4a04
2 changed files with 22 additions and 15 deletions

View File

@@ -24,14 +24,17 @@ regions_exclude = us-gov-west-1,cn-north-1
# This is the normal destination variable to use. If you are running Ansible # This is the normal destination variable to use. If you are running Ansible
# from outside EC2, then 'public_dns_name' makes the most sense. If you are # from outside EC2, then 'public_dns_name' makes the most sense. If you are
# running Ansible from within EC2, then perhaps you want to use the internal # running Ansible from within EC2, then perhaps you want to use the internal
# address, and should set this to 'private_dns_name'. # address, and should set this to 'private_dns_name'. The key of an EC2 tag
# may optionally be used; however the boto instance variables hold precedence
# in the event of a collision.
destination_variable = public_dns_name destination_variable = public_dns_name
# For server inside a VPC, using DNS names may not make sense. When an instance # For server inside a VPC, using DNS names may not make sense. When an instance
# has 'subnet_id' set, this variable is used. If the subnet is public, setting # has 'subnet_id' set, this variable is used. If the subnet is public, setting
# this to 'ip_address' will return the public IP address. For instances in a # this to 'ip_address' will return the public IP address. For instances in a
# private subnet, this should be set to 'private_ip_address', and Ansible must # private subnet, this should be set to 'private_ip_address', and Ansible must
# be run from with EC2. # be run from within EC2. The key of an EC2 tag may optionally be used; however
# the boto instance variables hold precedence in the event of a collision.
vpc_destination_variable = ip_address vpc_destination_variable = ip_address
# To tag instances on EC2 with the resource records that point to them from # To tag instances on EC2 with the resource records that point to them from

View File

@@ -122,7 +122,9 @@ import boto
from boto import ec2 from boto import ec2
from boto import rds from boto import rds
from boto import route53 from boto import route53
import ConfigParser import six
from six.moves import configparser
from collections import defaultdict from collections import defaultdict
try: try:
@@ -166,7 +168,7 @@ class Ec2Inventory(object):
else: else:
data_to_print = self.json_format_dict(self.inventory, True) data_to_print = self.json_format_dict(self.inventory, True)
print data_to_print print(data_to_print)
def is_cache_valid(self): def is_cache_valid(self):
@@ -184,8 +186,10 @@ class Ec2Inventory(object):
def read_settings(self): def read_settings(self):
''' Reads the settings from the ec2.ini file ''' ''' Reads the settings from the ec2.ini file '''
if six.PY2:
config = ConfigParser.SafeConfigParser() config = configparser.SafeConfigParser()
else:
config = configparser.ConfigParser()
ec2_default_ini_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ec2.ini') ec2_default_ini_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'ec2.ini')
ec2_ini_path = os.environ.get('EC2_INI_PATH', ec2_default_ini_path) ec2_ini_path = os.environ.get('EC2_INI_PATH', ec2_default_ini_path)
config.read(ec2_ini_path) config.read(ec2_ini_path)
@@ -282,7 +286,7 @@ class Ec2Inventory(object):
self.pattern_include = re.compile(pattern_include) self.pattern_include = re.compile(pattern_include)
else: else:
self.pattern_include = None self.pattern_include = None
except ConfigParser.NoOptionError, e: except configparser.NoOptionError as e:
self.pattern_include = None self.pattern_include = None
# Do we need to exclude hosts that match a pattern? # Do we need to exclude hosts that match a pattern?
@@ -292,7 +296,7 @@ class Ec2Inventory(object):
self.pattern_exclude = re.compile(pattern_exclude) self.pattern_exclude = re.compile(pattern_exclude)
else: else:
self.pattern_exclude = None self.pattern_exclude = None
except ConfigParser.NoOptionError, e: except configparser.NoOptionError as e:
self.pattern_exclude = None self.pattern_exclude = None
# Instance filters (see boto and EC2 API docs). Ignore invalid filters. # Instance filters (see boto and EC2 API docs). Ignore invalid filters.
@@ -354,7 +358,7 @@ class Ec2Inventory(object):
conn = self.connect(region) conn = self.connect(region)
reservations = [] reservations = []
if self.ec2_instance_filters: if self.ec2_instance_filters:
for filter_key, filter_values in self.ec2_instance_filters.iteritems(): for filter_key, filter_values in self.ec2_instance_filters.items():
reservations.extend(conn.get_all_instances(filters = { filter_key : filter_values })) reservations.extend(conn.get_all_instances(filters = { filter_key : filter_values }))
else: else:
reservations = conn.get_all_instances() reservations = conn.get_all_instances()
@@ -363,7 +367,7 @@ class Ec2Inventory(object):
for instance in reservation.instances: for instance in reservation.instances:
self.add_instance(instance, region) self.add_instance(instance, region)
except boto.exception.BotoServerError, e: except boto.exception.BotoServerError as e:
if e.error_code == 'AuthFailure': if e.error_code == 'AuthFailure':
error = self.get_auth_error_message() error = self.get_auth_error_message()
else: else:
@@ -381,7 +385,7 @@ class Ec2Inventory(object):
instances = conn.get_all_dbinstances() instances = conn.get_all_dbinstances()
for instance in instances: for instance in instances:
self.add_rds_instance(instance, region) self.add_rds_instance(instance, region)
except boto.exception.BotoServerError, e: except boto.exception.BotoServerError as e:
error = e.reason error = e.reason
if e.error_code == 'AuthFailure': if e.error_code == 'AuthFailure':
@@ -515,7 +519,7 @@ class Ec2Inventory(object):
# Inventory: Group by tag keys # Inventory: Group by tag keys
if self.group_by_tag_keys: if self.group_by_tag_keys:
for k, v in instance.tags.iteritems(): for k, v in instance.tags.items():
key = self.to_safe("tag_" + k + "=" + v) key = self.to_safe("tag_" + k + "=" + v)
self.push(self.inventory, key, dest) self.push(self.inventory, key, dest)
if self.nested_groups: if self.nested_groups:
@@ -690,7 +694,7 @@ class Ec2Inventory(object):
instance_vars['ec2_previous_state_code'] = instance.previous_state_code instance_vars['ec2_previous_state_code'] = instance.previous_state_code
elif type(value) in [int, bool]: elif type(value) in [int, bool]:
instance_vars[key] = value instance_vars[key] = value
elif type(value) in [str, unicode]: elif isinstance(value, six.string_types):
instance_vars[key] = value.strip() instance_vars[key] = value.strip()
elif type(value) == type(None): elif type(value) == type(None):
instance_vars[key] = '' instance_vars[key] = ''
@@ -699,7 +703,7 @@ class Ec2Inventory(object):
elif key == 'ec2__placement': elif key == 'ec2__placement':
instance_vars['ec2_placement'] = value.zone instance_vars['ec2_placement'] = value.zone
elif key == 'ec2_tags': elif key == 'ec2_tags':
for k, v in value.iteritems(): for k, v in value.items():
key = self.to_safe('ec2_tag_' + k) key = self.to_safe('ec2_tag_' + k)
instance_vars[key] = v instance_vars[key] = v
elif key == 'ec2_groups': elif key == 'ec2_groups':
@@ -787,7 +791,7 @@ class Ec2Inventory(object):
''' Converts 'bad' characters in a string to underscores so they can be ''' Converts 'bad' characters in a string to underscores so they can be
used as Ansible groups ''' used as Ansible groups '''
return re.sub("[^A-Za-z0-9\-]", "_", word) return re.sub("[^A-Za-z0-9\_]", "_", word)
def json_format_dict(self, data, pretty=False): def json_format_dict(self, data, pretty=False):