Add support to ec2_eip to associate with a secondary ip address (#19484)
This commit is contained in:
parent
58b067532f
commit
b77ab1a6c9
1 changed files with 25 additions and 12 deletions
|
@ -65,6 +65,12 @@ options:
|
||||||
required: false
|
required: false
|
||||||
default: false
|
default: false
|
||||||
version_added: "2.0"
|
version_added: "2.0"
|
||||||
|
private_ip_address:
|
||||||
|
description:
|
||||||
|
- The primary or secondary private IP address to associate with the Elastic IP address.
|
||||||
|
required: False
|
||||||
|
default: None
|
||||||
|
version_added: "2.3"
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- aws
|
- aws
|
||||||
- ec2
|
- ec2
|
||||||
|
@ -82,6 +88,8 @@ notes:
|
||||||
'''
|
'''
|
||||||
|
|
||||||
EXAMPLES = '''
|
EXAMPLES = '''
|
||||||
|
# Note: These examples do not set authentication details, see the AWS Guide for details.
|
||||||
|
|
||||||
- name: associate an elastic IP with an instance
|
- name: associate an elastic IP with an instance
|
||||||
ec2_eip:
|
ec2_eip:
|
||||||
device_id: i-1212f003
|
device_id: i-1212f003
|
||||||
|
@ -109,7 +117,8 @@ EXAMPLES = '''
|
||||||
device_id: i-1212f003
|
device_id: i-1212f003
|
||||||
|
|
||||||
- name: allocate a new elastic IP without associating it to anything
|
- name: allocate a new elastic IP without associating it to anything
|
||||||
action: ec2_eip
|
ec2_eip:
|
||||||
|
state: present
|
||||||
register: eip
|
register: eip
|
||||||
|
|
||||||
- name: output the IP
|
- name: output the IP
|
||||||
|
@ -157,7 +166,7 @@ class EIPException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def associate_ip_and_device(ec2, address, device_id, check_mode, isinstance=True):
|
def associate_ip_and_device(ec2, address, private_ip_address, device_id, check_mode, isinstance=True):
|
||||||
if address_is_associated_with_device(ec2, address, device_id, isinstance):
|
if address_is_associated_with_device(ec2, address, device_id, isinstance):
|
||||||
return {'changed': False}
|
return {'changed': False}
|
||||||
|
|
||||||
|
@ -165,11 +174,11 @@ def associate_ip_and_device(ec2, address, device_id, check_mode, isinstance=True
|
||||||
if not check_mode:
|
if not check_mode:
|
||||||
if isinstance:
|
if isinstance:
|
||||||
if address.domain == "vpc":
|
if address.domain == "vpc":
|
||||||
res = ec2.associate_address(device_id, allocation_id=address.allocation_id)
|
res = ec2.associate_address(device_id, allocation_id=address.allocation_id, private_ip_address=private_ip_address)
|
||||||
else:
|
else:
|
||||||
res = ec2.associate_address(device_id, public_ip=address.public_ip)
|
res = ec2.associate_address(device_id, public_ip=address.public_ip, private_ip_address=private_ip_address)
|
||||||
else:
|
else:
|
||||||
res = ec2.associate_address(network_interface_id=device_id, allocation_id=address.allocation_id)
|
res = ec2.associate_address(network_interface_id=device_id, allocation_id=address.allocation_id, private_ip_address=private_ip_address)
|
||||||
if not res:
|
if not res:
|
||||||
raise EIPException('association failed')
|
raise EIPException('association failed')
|
||||||
|
|
||||||
|
@ -286,7 +295,7 @@ def find_device(ec2, module, device_id, isinstance=True):
|
||||||
raise EIPException("could not find instance" + device_id)
|
raise EIPException("could not find instance" + device_id)
|
||||||
|
|
||||||
|
|
||||||
def ensure_present(ec2, module, domain, address, device_id,
|
def ensure_present(ec2, module, domain, address, private_ip_address, device_id,
|
||||||
reuse_existing_ip_allowed, check_mode, isinstance=True):
|
reuse_existing_ip_allowed, check_mode, isinstance=True):
|
||||||
changed = False
|
changed = False
|
||||||
|
|
||||||
|
@ -306,12 +315,12 @@ def ensure_present(ec2, module, domain, address, device_id,
|
||||||
if len(instance.vpc_id) > 0 and domain is None:
|
if len(instance.vpc_id) > 0 and domain is None:
|
||||||
raise EIPException("You must set 'in_vpc' to true to associate an instance with an existing ip in a vpc")
|
raise EIPException("You must set 'in_vpc' to true to associate an instance with an existing ip in a vpc")
|
||||||
# Associate address object (provided or allocated) with instance
|
# Associate address object (provided or allocated) with instance
|
||||||
assoc_result = associate_ip_and_device(ec2, address, device_id,
|
assoc_result = associate_ip_and_device(ec2, address, private_ip_address, device_id,
|
||||||
check_mode)
|
check_mode)
|
||||||
else:
|
else:
|
||||||
instance = find_device(ec2, module, device_id, isinstance=False)
|
instance = find_device(ec2, module, device_id, isinstance=False)
|
||||||
# Associate address object (provided or allocated) with instance
|
# Associate address object (provided or allocated) with instance
|
||||||
assoc_result = associate_ip_and_device(ec2, address, device_id,
|
assoc_result = associate_ip_and_device(ec2, address, private_ip_address, device_id,
|
||||||
check_mode, isinstance=False)
|
check_mode, isinstance=False)
|
||||||
|
|
||||||
if instance.vpc_id:
|
if instance.vpc_id:
|
||||||
|
@ -351,11 +360,15 @@ def main():
|
||||||
default=False),
|
default=False),
|
||||||
release_on_disassociation=dict(required=False, type='bool', default=False),
|
release_on_disassociation=dict(required=False, type='bool', default=False),
|
||||||
wait_timeout=dict(default=300),
|
wait_timeout=dict(default=300),
|
||||||
|
private_ip_address=dict(required=False, default=None, type='str')
|
||||||
))
|
))
|
||||||
|
|
||||||
module = AnsibleModule(
|
module = AnsibleModule(
|
||||||
argument_spec=argument_spec,
|
argument_spec=argument_spec,
|
||||||
supports_check_mode=True
|
supports_check_mode=True,
|
||||||
|
required_together=[
|
||||||
|
('device_id', 'private_ip_address'),
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
if not HAS_BOTO:
|
if not HAS_BOTO:
|
||||||
|
@ -366,6 +379,7 @@ def main():
|
||||||
device_id = module.params.get('device_id')
|
device_id = module.params.get('device_id')
|
||||||
instance_id = module.params.get('instance_id')
|
instance_id = module.params.get('instance_id')
|
||||||
public_ip = module.params.get('public_ip')
|
public_ip = module.params.get('public_ip')
|
||||||
|
private_ip_address = module.params.get('private_ip_address')
|
||||||
state = module.params.get('state')
|
state = module.params.get('state')
|
||||||
in_vpc = module.params.get('in_vpc')
|
in_vpc = module.params.get('in_vpc')
|
||||||
domain = 'vpc' if in_vpc else None
|
domain = 'vpc' if in_vpc else None
|
||||||
|
@ -392,9 +406,8 @@ def main():
|
||||||
|
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
if device_id:
|
if device_id:
|
||||||
result = ensure_present(ec2, module, domain, address, device_id,
|
result = ensure_present(ec2, module, domain, address, private_ip_address, device_id,
|
||||||
reuse_existing_ip_allowed,
|
reuse_existing_ip_allowed, module.check_mode, isinstance=is_instance)
|
||||||
module.check_mode, isinstance=is_instance)
|
|
||||||
else:
|
else:
|
||||||
address = allocate_address(ec2, domain, reuse_existing_ip_allowed)
|
address = allocate_address(ec2, domain, reuse_existing_ip_allowed)
|
||||||
result = {'changed': True, 'public_ip': address.public_ip, 'allocation_id': address.allocation_id}
|
result = {'changed': True, 'public_ip': address.public_ip, 'allocation_id': address.allocation_id}
|
||||||
|
|
Loading…
Reference in a new issue