summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Mendes <rmendes@illumina.com>2015-08-31 09:06:18 -0700
committerRick Mendes <rmendes@illumina.com>2015-08-31 09:06:18 -0700
commita18c96882e2713909206c82afc2e7754b206c35d (patch)
treeb79bd3920f5fdbb221dd0c4255086dd5ec6c0c67
parentef1f31c652f6dc53babb567e8927e2cf9fc363eb (diff)
downloadansible-modules-core-a18c96882e2713909206c82afc2e7754b206c35d.tar.gz
using single device_id and enabling release on disassociation
-rw-r--r--cloud/amazon/ec2_eip.py75
1 files changed, 43 insertions, 32 deletions
diff --git a/cloud/amazon/ec2_eip.py b/cloud/amazon/ec2_eip.py
index ae3cd06e..5d6532b3 100644
--- a/cloud/amazon/ec2_eip.py
+++ b/cloud/amazon/ec2_eip.py
@@ -22,14 +22,11 @@ description:
- This module associates AWS EC2 elastic IP addresses with instances
version_added: "1.4"
options:
- instance_id:
+ device_id:
description:
- - The EC2 instance id
- required: false
- network_interface_id:
- description:
- - The Elastic Network Interface (ENI) id
+ - The id of the device for the EIP. Can be an EC2 Instance id or Elastic Network Interface (ENI) id.
required: false
+ aliases: [ instance_id ]
version_added: "2.0"
public_ip:
description:
@@ -61,8 +58,15 @@ options:
required: false
default: false
version_added: "1.6"
+ release_on_disassociation:
+ description:
+ - whether or not to automatically release the EIP when it is disassociated
+ required: false
+ default: false
+ version_added: "2.0"
extends_documentation_fragment: aws
author: "Lorin Hochstein (@lorin) <lorin@nimbisservices.com>"
+author: "Rick Mendes (@rickmendes) <rmendes@illumina.com>"
notes:
- This module will return C(public_ip) on success, which will contain the
public IP address associated with the instance.
@@ -70,19 +74,22 @@ notes:
the cloud instance is reachable via the new address. Use wait_for and
pause to delay further playbook execution until the instance is reachable,
if necessary.
+ - This module returns multiple changed statuses on disassociation or release.
+ It returns an overall status based on any changes occuring. It also returns
+ individual changed statuses for disassociation and release.
'''
EXAMPLES = '''
- name: associate an elastic IP with an instance
- ec2_eip: instance_id=i-1212f003 ip=93.184.216.119
+ ec2_eip: device_id=i-1212f003 ip=93.184.216.119
- name: associate an elastic IP with a device
- ec2_eip: network_interface_id=eni-c8ad70f3 ip=93.184.216.119
+ ec2_eip: device_id=eni-c8ad70f3 ip=93.184.216.119
- name: disassociate an elastic IP from an instance
- ec2_eip: instance_id=i-1212f003 ip=93.184.216.119 state=absent
+ ec2_eip: device_id=i-1212f003 ip=93.184.216.119 state=absent
- name: disassociate an elastic IP with a device
- ec2_eip: network_interface_id=eni-c8ad70f3 ip=93.184.216.119 state=absent
+ ec2_eip: device_id=eni-c8ad70f3 ip=93.184.216.119 state=absent
- name: allocate a new elastic IP and associate it with an instance
- ec2_eip: instance_id=i-1212f003
+ ec2_eip: device_id=i-1212f003
- name: allocate a new elastic IP without associating it to anything
action: ec2_eip
register: eip
@@ -95,7 +102,7 @@ EXAMPLES = '''
''' group=webserver count=3
register: ec2
- name: associate new elastic IPs with each of the instances
- ec2_eip: "instance_id={{ item }}"
+ ec2_eip: "device_id={{ item }}"
with_items: ec2.instance_ids
- name: allocate a new elastic IP inside a VPC in us-west-2
ec2_eip: region=us-west-2 in_vpc=yes
@@ -292,14 +299,14 @@ def ensure_absent(ec2, domain, address, device_id, check_mode, isinstance=True):
def main():
argument_spec = ec2_argument_spec()
argument_spec.update(dict(
- instance_id=dict(required=False),
- network_interface_id=dict(required=False),
+ device_id=dict(required=False, aliases=['instance_id']),
public_ip=dict(required=False, aliases=['ip']),
state=dict(required=False, default='present',
choices=['present', 'absent']),
in_vpc=dict(required=False, type='bool', default=False),
reuse_existing_ip_allowed=dict(required=False, type='bool',
default=False),
+ release_on_disassociation=dict(required=False, type='bool', default=False),
wait_timeout=dict(default=300),
))
@@ -313,42 +320,46 @@ def main():
ec2 = ec2_connect(module)
- instance_id = module.params.get('instance_id')
- network_interface_id = module.params.get('network_interface_id')
+ device_id = module.params.get('device_id')
public_ip = module.params.get('public_ip')
state = module.params.get('state')
in_vpc = module.params.get('in_vpc')
domain = 'vpc' if in_vpc else None
reuse_existing_ip_allowed = module.params.get('reuse_existing_ip_allowed')
+ release_on_disassociation = module.params.get('release_on_disassociation')
+
+ if device_id and device_id.startswith('i-'):
+ is_instance=True
+ elif device_id:
+ is_instance=False
try:
- if network_interface_id:
- address = find_address(ec2, public_ip, network_interface_id, isinstance=False)
- elif instance_id:
- address = find_address(ec2, public_ip, instance_id)
+ if device_id:
+ address = find_address(ec2, public_ip, device_id, isinstance=is_instance)
else:
address = False
if state == 'present':
- if instance_id:
- result = ensure_present(ec2, domain, address, instance_id,
- reuse_existing_ip_allowed,
- module.check_mode)
- elif network_interface_id:
- result = ensure_present(ec2, domain, address, network_interface_id,
+ if device_id:
+ result = ensure_present(ec2, domain, address, device_id,
reuse_existing_ip_allowed,
- module.check_mode, isinstance=False)
+ module.check_mode, isinstance=is_instance)
else:
address = allocate_address(ec2, domain, reuse_existing_ip_allowed)
result = {'changed': True, 'public_ip': address.public_ip}
else:
- if network_interface_id:
- result = ensure_absent(ec2, domain, address, network_interface_id, module.check_mode, isinstance=False)
- elif instance_id:
- result = ensure_absent(ec2, domain, address, instance_id, module.check_mode)
+ if device_id:
+ disassociated = ensure_absent(ec2, domain, address, device_id, module.check_mode, isinstance=is_instance)
+
+ if release_on_disassociation and disassociated['changed']:
+ released = release_address(ec2, address, module.check_mode)
+ result = { 'changed': True, 'disassociated': disassociated, 'released': released }
+ else:
+ result = { 'changed': disassociated['changed'], 'disassociated': disassociated, 'released': { 'changed': False } }
else:
address = find_address(ec2, public_ip, None)
- result = release_address(ec2, address, module.check_mode)
+ released = release_address(ec2, address, module.check_mode)
+ result = { 'changed': released['changed'], 'disassociated': { 'changed': False }, 'released': released }
except (boto.exception.EC2ResponseError, EIPException) as e:
module.fail_json(msg=str(e))