Commit a4f5954b by Hannah Chen

update instance monitoring script

parent 3e562bd8
...@@ -17,6 +17,7 @@ requests==2.9.1 ...@@ -17,6 +17,7 @@ requests==2.9.1
datadog==0.8.0 datadog==0.8.0
networkx==1.11 networkx==1.11
pathlib2==2.1.0 pathlib2==2.1.0
boto3==1.4.4
# Needed for the mongo_* modules (playbooks/library/mongo_*) # Needed for the mongo_* modules (playbooks/library/mongo_*)
pymongo==3.1 pymongo==3.1
......
...@@ -2,9 +2,9 @@ import boto3 ...@@ -2,9 +2,9 @@ import boto3
import argparse import argparse
import sys import sys
import yaml import yaml
import pprint from pprint import pprint
def find_active_instances(cluster_file): def find_active_instances(cluster_file, region):
""" """
Determines if a given cluster has at least one ASG and at least one active instance. Determines if a given cluster has at least one ASG and at least one active instance.
...@@ -14,24 +14,19 @@ def find_active_instances(cluster_file): ...@@ -14,24 +14,19 @@ def find_active_instances(cluster_file):
and cluster to find ASG's and active instances for. and cluster to find ASG's and active instances for.
""" """
pp = pprint.PrettyPrinter() with open(cluster_file, 'r') as f:
cluster_map = yaml.safe_load(f)
f = open(cluster_file)
cluster_map = yaml.safe_load(f)
f.close()
region = 'us-east-1'
asg = boto3.client('autoscaling', region) asg = boto3.client('autoscaling', region)
all_groups = asg.describe_auto_scaling_groups() all_groups = asg.describe_auto_scaling_groups()
#all the asgs that match the specified environment, deployment, and cluster triples from the cluster map # dictionary that contains the environment/deployment/cluster triple as the key and the value is a list of the asgs that match the triple
all_matching_asgs = [] all_matching_asgs = {}
#all the triples for which an autoscaling group does not exist # all the triples for which an autoscaling group does not exist
not_matching_triples = [] not_matching_triples = []
#check if there exists at least one ASG for each triple # check if there exists at least one ASG for each triple
for triple in cluster_map: for triple in cluster_map:
#the asgs that match this particular triple #the asgs that match this particular triple
cluster_asgs = [] cluster_asgs = []
...@@ -53,29 +48,35 @@ def find_active_instances(cluster_file): ...@@ -53,29 +48,35 @@ def find_active_instances(cluster_file):
if not cluster_asgs: if not cluster_asgs:
not_matching_triples += [triple] not_matching_triples += [triple]
else: else:
all_matching_asgs += cluster_asgs triple_str = triple['env'] + '-' + triple['deployment'] + '-' + triple['cluster']
all_matching_asgs[triple_str] = cluster_asgs
#The ASG's for the triples that have no active instances #The triples that have no active instances
no_active_instances_asgs = [] no_active_instances_triples = []
#check to make sure each ASG has at least 1 running instance #check that each triple has at least one active instance in at least one of its ASG's
for asg in all_matching_asgs: for triple in all_matching_asgs:
asg_has_active_instances = False asgs = all_matching_asgs[triple]
for instance in asg['Instances']: triple_has_active_instances = False
if instance['LifecycleState'] == 'InService': for asg in asgs:
asg_has_active_instances = True for instance in asg['Instances']:
break if instance['LifecycleState'] == 'InService':
if not asg_has_active_instances: triple_has_active_instances = True
no_active_instances_asgs += [asg] if not triple_has_active_instances:
no_active_instances_triples += [triple]
if no_active_instances_asgs or not_matching_triples: if no_active_instances_triples or not_matching_triples:
if not_matching_triples: if not_matching_triples:
print('Fail. There are no autoscaling groups found for the following cluster(s):') print('Fail. There are no autoscaling groups found for the following cluster(s):')
pp.pprint(not_matching_triples) pprint(not_matching_triples)
if no_active_instances_asgs: if no_active_instances_triples:
print("Fail. There are no active instances for the following ASG's:") print("Fail. There are no active instances for the following cluster(s)")
pp.pprint(no_active_instances_asgs) for triple in no_active_instances_triples:
print('environment: ' + triple.split('-')[0])
print('deployment: ' + triple.split('-')[1])
print('cluster: ' + triple.split('-')[2])
print('----')
sys.exit(1) sys.exit(1)
print("Success. ASG's with active instances found for all of the cluster triples.") print("Success. ASG's with active instances found for all of the cluster triples.")
...@@ -85,7 +86,8 @@ def find_active_instances(cluster_file): ...@@ -85,7 +86,8 @@ def find_active_instances(cluster_file):
if __name__=="__main__": if __name__=="__main__":
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', help='Yaml file of env/deployment/cluster triples that we want to find active instances for', required=True) parser.add_argument('-f', '--file', help='Yaml file of env/deployment/cluster triples that we want to find active instances for', required=True)
parser.add_argument('-r', '--region', help="Region that we want to find ASG's and active instances in", default='us-east-1', required=True)
args = parser.parse_args() args = parser.parse_args()
find_active_instances(args.file) find_active_instances(args.file, args.region)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment