diff options
author | Ryan Brown <sb@ryansb.com> | 2016-11-14 21:46:19 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-14 21:46:19 +0000 |
commit | f35be48335794fee97985900862ad9f973a1e5df (patch) | |
tree | 8ad099ceb195d2fc12261197d229382e437a0390 | |
parent | d21ac8a5da5a2439caec2f8e57fb2a6986256840 (diff) | |
parent | af645041e537181c10dc3bfec59a53dc6523ba4b (diff) | |
download | ansible-modules-core-f35be48335794fee97985900862ad9f973a1e5df.tar.gz |
Support suspending scaling processes in `ec2_asg` module (#5562)
* Add support for suspending scaling processes
Ref: http://docs.aws.amazon.com/autoscaling/latest/userguide/as-suspend-resume-processes.html
* Set suspend_processes version_added to 2.3
-rw-r--r-- | cloud/amazon/ec2_asg.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/cloud/amazon/ec2_asg.py b/cloud/amazon/ec2_asg.py index 908e0927..378aaddd 100644 --- a/cloud/amazon/ec2_asg.py +++ b/cloud/amazon/ec2_asg.py @@ -148,6 +148,13 @@ options: default: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR'] required: false version_added: "2.2" + suspend_processes: + description: + - A list of scaling processes to suspend. + required: False + default: [] + choices: ['Launch', 'Terminate', 'HealthCheck', 'ReplaceUnhealthy', 'AZRebalance', 'AlarmNotification', 'ScheduledActions', 'AddToLoadBalancer'] + version_added: "2.3" extends_documentation_fragment: - aws - ec2 @@ -393,6 +400,28 @@ def wait_for_elb(asg_connection, module, group_name): module.fail_json(msg = "Waited too long for ELB instances to be healthy. %s" % time.asctime()) log.debug("Waiting complete. ELB thinks {0} instances are healthy.".format(healthy_instances)) + +def suspend_processes(as_group, module): + suspend_processes = set(module.params.get('suspend_processes')) + + try: + suspended_processes = set([p.process_name for p in as_group.suspended_processes]) + except AttributeError: + # New ASG being created, no suspended_processes defined yet + suspended_processes = set() + + if suspend_processes == suspended_processes: + return False + + resume_processes = list(suspended_processes - suspend_processes) + if resume_processes: + as_group.resume_processes(resume_processes) + + if suspend_processes: + as_group.suspend_processes(list(suspend_processes)) + + return True + def create_autoscaling_group(connection, module): group_name = module.params.get('name') load_balancers = module.params['load_balancers'] @@ -458,6 +487,7 @@ def create_autoscaling_group(connection, module): try: connection.create_auto_scaling_group(ag) + suspend_processes(ag, module) if wait_for_instances: wait_for_new_inst(module, connection, group_name, wait_timeout, desired_capacity, 'viable_instances') wait_for_elb(connection, module, group_name) @@ -474,6 +504,10 @@ def create_autoscaling_group(connection, module): else: as_group = as_groups[0] changed = False + + if suspend_processes(as_group, module): + changed = True + for attr in ASG_ATTRIBUTES: if module.params.get(attr, None) is not None: module_attr = module.params.get(attr) @@ -848,7 +882,8 @@ def main(): 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR' - ]) + ]), + suspend_processes=dict(type='list', default=[]) ), ) |