From 009d0a4bb44dfc299b2212e322a4b93e16d60a4a Mon Sep 17 00:00:00 2001 From: Andy Grimm Date: Mon, 9 Mar 2015 10:49:54 -0400 Subject: [PATCH] Flexible tag-based naming for ec2 hosts Introduces destination_format and destination_format_tags to allow the construction of host names based on one or more ec2 tags and a python format string. --- contrib/inventory/ec2.ini | 10 ++++++++++ contrib/inventory/ec2.py | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/contrib/inventory/ec2.ini b/contrib/inventory/ec2.ini index a1d9b1d805..5bac496ff5 100644 --- a/contrib/inventory/ec2.ini +++ b/contrib/inventory/ec2.ini @@ -40,6 +40,16 @@ destination_variable = public_dns_name # vpc_destination_variable = 'private_ip_address' vpc_destination_variable = ip_address +# The following two settings allow flexible ansible host naming based on a +# python format string and a comma-separated list of ec2 tags. Note that: +# +# 1) If the tags referenced are not present for some instances, empty strings +# will be substituted in the format string. +# 2) This overrides both destination_variable and vpc_destination_variable. +# +#destination_format = {0}.{1}.example.com +#destination_format_tags = Name,environment + # To tag instances on EC2 with the resource records that point to them from # Route53, uncomment and set 'route53' to True. route53 = False diff --git a/contrib/inventory/ec2.py b/contrib/inventory/ec2.py index a8e042e3f4..8c8e5e9458 100755 --- a/contrib/inventory/ec2.py +++ b/contrib/inventory/ec2.py @@ -220,6 +220,13 @@ class Ec2Inventory(object): # Destination addresses self.destination_variable = config.get('ec2', 'destination_variable') self.vpc_destination_variable = config.get('ec2', 'vpc_destination_variable') + if config.has_option('ec2', 'destination_format') and \ + config.has_option('ec2', 'destination_format_tags'): + self.destination_format = config.get('ec2', 'destination_format') + self.destination_format_tags = config.get('ec2', 'destination_format_tags').split(',') + else: + self.destination_format = None + self.destination_format_tags = None # Route53 self.route53_enabled = config.getboolean('ec2', 'route53') @@ -536,7 +543,9 @@ class Ec2Inventory(object): return # Select the best destination address - if instance.subnet_id: + if self.destination_format and self.destination_format_tags: + dest = self.destination_format.format(*[ getattr(instance, 'tags').get(tag, '') for tag in self.destination_format_tags ]) + elif instance.subnet_id: dest = getattr(instance, self.vpc_destination_variable, None) if dest is None: dest = getattr(instance, 'tags').get(self.vpc_destination_variable, None)