using instance_ids and state=absent for removing instances

This commit is contained in:
John Jarvis 2013-06-21 13:43:29 -04:00
parent 3a5f095693
commit c85b0bb05f

View file

@ -163,13 +163,21 @@ options:
required: false
defualt: null
aliases: []
termination_list:
instance_ids:
version_added: "1.3"
description:
- list of instances to terminate in the form of [{id: <inst-id>}, {id: <inst-id>}].
- list of instance ids, currently only used when state='absent'
required: false
default: null
aliases: []
state:
version_added: "1.3"
description:
- create or terminate instances
required: false
default: 'present'
aliases: []
requirements: [ "boto" ]
author: Seth Vidal, Tim Gerla, Lester Wade
@ -260,7 +268,8 @@ local_action:
- name: Terminate instances that were previously launched
local_action:
module: ec2
termination_list: ${ec2.instances}
state: 'absent'
instance_ids: {{ec2.intance_ids}}
'''
@ -439,14 +448,16 @@ def create_instances(module, ec2):
running_instances.append(inst)
instance_dict_array = []
created_instance_ids = []
for inst in running_instances:
d = get_instance_info(inst)
created_instance_ids.append(inst.id)
instance_dict_array.append(d)
return instance_dict_array
return (instance_dict_array, created_instance_ids)
def terminate_instances(module, ec2, termination_list):
def terminate_instances(module, ec2, instance_ids):
"""
Terminates a list of instances
@ -462,13 +473,18 @@ def terminate_instances(module, ec2, termination_list):
"changed" will be set to False.
"""
instance_ids = [str(inst['id']) for inst in termination_list]
changed = False
instance_dict_array = []
if not isinstance(instance_ids, list) or len(instance_ids) < 1:
module.fail_json(msg='instance_ids should be a list of instances, aborting')
terminated_instance_ids = []
for res in ec2.get_all_instances(instance_ids):
for inst in res.instances:
if inst.state == 'running':
terminated_instance_ids.append(inst.id)
instance_dict_array.append(get_instance_info(inst))
try:
ec2.terminate_instances([inst.id])
@ -476,7 +492,7 @@ def terminate_instances(module, ec2, termination_list):
module.fail_json(msg='Unable to terminate instance {0}, error: {1}'.format(inst.id, e))
changed = True
return (changed, instance_dict_array)
return (changed, instance_dict_array, terminated_instance_ids)
@ -505,7 +521,8 @@ def main():
instance_tags = dict(),
vpc_subnet_id = dict(),
private_ip = dict(),
termination_list = dict(type='list')
instance_ids = dict(type='list'),
state = dict(default='present'),
)
)
@ -540,23 +557,23 @@ def main():
except boto.exception.NoAuthHandlerFound, e:
module.fail_json(msg = str(e))
if termination_list:
if not isinstance(termination_list, list):
if module.params.get('state') == 'absent':
instance_ids = module.params.get('instance_ids')
if not isinstance(instance_ids, list):
module.fail_json(msg='termination_list needs to be a list of instances to terminate')
(changed, instance_dict_array) = terminate_instances(module, ec2, termination_list)
else:
(changed, instance_dict_array, new_instance_ids) = terminate_instances(module, ec2, instance_ids)
elif module.params.get('state') == 'present':
# Changed is always set to true when provisioning new instances
changed = True
if not module.params.get('key_name'):
module.fail_json(msg='key_name parameter is required for new instance')
if not module.params.get('image'):
module.fail_json(msg='image parameter is required for new instance')
instance_dict_array = create_instances(module, ec2)
(instance_dict_array, new_instance_ids) = create_instances(module, ec2)
module.exit_json(changed=True, instances=instance_dict_array)
module.exit_json(changed=True, instance_ids=new_instance_ids, instances=instance_dict_array)
# this is magic, see lib/ansible/module_common.py