Merge branch 'ec2-tag-filter' of https://github.com/michalgasek/ansible into michalgasek-ec2-tag-filter

This commit is contained in:
James Cammarata 2014-09-16 15:11:05 -05:00
commit 21409d6052
2 changed files with 35 additions and 1 deletions

View file

@ -73,3 +73,23 @@ nested_groups = False
# If you want to exclude any hosts that match a certain regular expression # If you want to exclude any hosts that match a certain regular expression
# pattern_exclude = stage-* # pattern_exclude = stage-*
# Instance filters can be used to control which instances are retrieved for
# inventory. For the full list of possible filters, please read the EC2 API
# docs: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html#query-DescribeInstances-filters
# Filters are key/value pairs separated by '=', to list multiple filters use
# a list separated by commas. See examples below.
# Retrieve only instances with (key=value) env=stage tag
# instance_filters = tag:env=stage
# Retrieve only instances with role=webservers OR role=dbservers tag
# instance_filters = tag:role=webservers,tag:role=dbservers
# Retrieve only t1.micro instances OR instances with tag env=stage
# instance_filters = instance-type=t1.micro,tag:env=stage
# You can use wildcards in filter values also. Below will list instances which
# tag Name value matches webservers1*
# (ex. webservers15, webservers1a, webservers123 etc)
# instance_filters = tag:Name=webservers1*

View file

@ -123,6 +123,7 @@ from boto import ec2
from boto import rds from boto import rds
from boto import route53 from boto import route53
import ConfigParser import ConfigParser
from collections import defaultdict
try: try:
import json import json
@ -272,6 +273,13 @@ class Ec2Inventory(object):
except ConfigParser.NoOptionError, e: except ConfigParser.NoOptionError, e:
self.pattern_exclude = None self.pattern_exclude = None
# Instance filters (see boto and EC2 API docs)
self.ec2_instance_filters = defaultdict(list)
if config.has_option('ec2', 'instance_filters'):
for x in config.get('ec2', 'instance_filters', '').split(','):
filter_key, filter_value = x.split('=')
self.ec2_instance_filters[filter_key].append(filter_value)
def parse_cli_args(self): def parse_cli_args(self):
''' Command line argument processing ''' ''' Command line argument processing '''
@ -316,7 +324,13 @@ class Ec2Inventory(object):
print("region name: %s likely not supported, or AWS is down. connection to region failed." % region) print("region name: %s likely not supported, or AWS is down. connection to region failed." % region)
sys.exit(1) sys.exit(1)
reservations = []
if self.ec2_instance_filters:
for filter_key, filter_values in self.ec2_instance_filters.iteritems():
reservations.extend(conn.get_all_instances(filters = { filter_key : filter_values }))
else:
reservations = conn.get_all_instances() reservations = conn.get_all_instances()
for reservation in reservations: for reservation in reservations:
for instance in reservation.instances: for instance in reservation.instances:
self.add_instance(instance, region) self.add_instance(instance, region)