group inventory by instance tags as well
authorJustin Wind <j.wind@partner.samsung.com>
Mon, 3 Apr 2017 18:00:50 +0000 (11:00 -0700)
committerJustin Wind <j.wind@partner.samsung.com>
Mon, 3 Apr 2017 18:00:50 +0000 (11:00 -0700)
inventory/asg-inventory.py

index 34c6e1c6f7ce8df1e44e85ca6416712fdd99ed6d..d7141b6b3404d11a8ab0774d25446bda0792ec15 100755 (executable)
@@ -1,8 +1,15 @@
 #!/usr/bin/env python
 '''\
 Generate a JSON object containing the names of all the AWS Autoscaling
-Groups in an account and the IPs of the Instances within them, suitable
-for use as an Ansible inventory.
+Groups in an account, the IDs of the Instances within them, as well
+as all the Tags on those Instances, each containing a list of the IPs
+of the Instances, suitable for use as an Ansible inventory.
+
+This output is similar to the default ec2.py inventory script, but is
+far more limited in the scope of information is has to retreive, parse,
+and render.
+
+It does not currently deal with hostvars at all.
 '''
 
 import argparse
@@ -58,6 +65,23 @@ def allInstanceIPs(ec2c, InstanceIds=None, publicIPs=False):
     return instances
 
 
+def tagsOfInstances(ec2c, InstanceIds=None):
+    tags = {}
+    args = {'Filters': [{'Name': 'resource-type', 'Values': ["instance"]}]}
+    if InstanceIds:
+        args['Filters'] += [{'Name': 'resource-id', 'Values': InstanceIds}]
+    while True:
+        response = ec2c.describe_tags(**args)
+        for tag in response['Tags']:
+            tagname = "tag_{}_{}".format(tag['Key'], tag['Value'])
+            tagvalue = tag['ResourceId']
+            tags.setdefault(tagname, []).append(tagvalue)
+        if 'NextToken' not in response:
+            break
+        args['NextToken'] = response['NextToken']
+    return tags
+
+
 def regionInventory(sessionArgs, publicIPs=False):
     'Return dict results for one region.'
     session = boto3.session.Session(**sessionArgs)
@@ -76,6 +100,10 @@ def regionInventory(sessionArgs, publicIPs=False):
     # add ASG dict, replacing ASG Instance Id with instance IP
     inventory.update({asg:[AllInstanceIPs[iid] for iid in ASGs[asg] if iid in AllInstanceIPs] for asg in ASGs})
 
+    # group up instance tags as well
+    tags = tagsOfInstances(ec2c, AllInstanceIds)
+    inventory.update({tag:[AllInstanceIPs[iid] for iid in tags[tag] if iid in AllInstanceIPs] for tag in tags})
+
     return inventory