lib/ansible/modules/cloud/alicloud/_alicloud_eip.py (129 lines of code) (raw):
#!/usr/bin/python
# Copyright (c) 2017-present Alibaba Group Holding Limited. He Guimin <heguimin36@163.com>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see http://www.gnu.org/licenses/.
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1',
'state': ['deprecated'],
'supported_by': 'community'}
DOCUMENTATION = """
---
module: alicloud_eip
version_added: "1.0.9"
short_description: Create eip address and bind it to ECS or SLB instance.
deprecated:
removed_in: "1.5.0"
why: Alibaba Cloud module name prefix 'ali' will be more concise
alternative: Use M(ali_eip) instead
description:
- Create and release an elastic IP address
Associate/disassociate an EIP with ECS or SLB instance
options:
state:
description:
- state for operating elastic IP address
choices: ['present', 'absent']
default: present
bandwidth:
description:
- Maximum outgoing bandwidth to the EIP, measured in Mbps (Mega bit per second)
default: 5
internet_charge_type:
description:
- Internet charge type of ECS instance
choices: [ 'PayByBandwidth', 'PayByTraffic']
default: 'PayByBandwidth'
ip_address:
description:
- The IP address of a previously created EIP. A new EIP will be allocated if it is not specified.
- If present and instance_id is specified, the EIP is associated with the instance.
- If absent and instance_id is specified, the EIP is disassociated from the instance.
aliases: ['ip']
instance_id:
description:
- The id of the device for the EIP. Can be an ECS or SLB Instance id
aliases: ['device_id']
requirements:
- "python >= 2.6"
- "footmark >= 1.1.16"
extends_documentation_fragment:
- alicloud
author:
- "He Guimin (@xiaozhu36)"
"""
EXAMPLES = """
# provide some examples to manage eip addresses
- name: requesting eip
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key-id>
alicloud_secret_key: <your-alicloud-access-secret-key>
alicloud_region: cn-hongkong
internet_charge_type: PayByTraffic
bandwidth: 5
instance_id: i-23dsefwfv332
tasks:
- name: allocating an eip
alicloud_eip:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
internet_charge_type: '{{ internet_charge_type }}'
bandwidth: '{{ bandwidth }}'
state: present
register: new_eip
- name: associate the created EIP with an ECS instance
alicloud_eip:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
ip_address: '{{ new_eip.ip_address }}'
instance_id: '{{ instance_id }}'
state: present
- name: disassociate the created EIP with an ECS instance
alicloud_eip:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
ip_address: '{{ new_eip.ip_address }}'
instance_id: '{{ instance_id }}'
state: absent
- name: disassociate the created EIP with an ECS instance
alicloud_eip:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
ip_address: '{{ new_eip.ip_address }}'
state: absent
"""
RETURN = '''
ip_address:
description: IP address of the allocated EIP
returned: when present
type: string
sample: "123.56.0.206"
allocation_id:
description: ID of the allocated EIP
returned: when present
type: string
sample: "eip-25877c70x"
instance_id:
description: ID of the associated device
returned: when present
type: string
sample: "i-aex25877c70x"
eip:
description: Details about the allocated EIP
returned: when present
type: dict
sample: {
"allocation_time": "2017-11-13T06:32:50Z",
"bandwidth": "7",
"charge_type": "PostPaid",
"id": "eip-gw8wkbxtnl3mh2orfpwm6",
"instance_id": "",
"instance_type": "",
"internet_charge_type": "PayByTraffic",
"ip_address": "47.91.89.172",
"operation_locks": {
"lock_reason": []
},
"region_id": "eu-central-1",
"status": "Available"
}
'''
import time
from footmark.exception import VPCResponseError
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.alicloud_ecs import get_acs_connection_info, ecs_argument_spec, ecs_connect, vpc_connect
HAS_FOOTMARK = False
try:
from footmark.exception import ECSResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False
def get_eip(eip_obj):
if eip_obj:
return {
"id": eip_obj.id,
"allocation_time": eip_obj.allocation_time,
"bandwidth": eip_obj.bandwidth,
"instance_id": eip_obj.instance_id,
"instance_type": eip_obj.instance_type,
"internet_charge_type": eip_obj.internet_charge_type,
"ip_address": eip_obj.ip_address,
"operation_locks": eip_obj.operation_locks,
"region_id": eip_obj.region_id,
"status": eip_obj.status,
"charge_type": eip_obj.charge_type
}
return None
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
state=dict(type='str', default='present', choices=['present', 'absent']),
ip_address=dict(type='str', aliases=['ip']),
instance_id=dict(type='str', aliases=['device_id']),
internet_charge_type=dict(type='str', default='PayByBandwidth', choices=['PayByTraffic', 'PayByBandwidth']),
bandwidth=dict(type='int', default=5)
))
module = AnsibleModule(argument_spec=argument_spec)
if HAS_FOOTMARK is False:
module.fail_json(msg="Package 'footmark' required for the module alicloud_eip.")
module = AnsibleModule(argument_spec=argument_spec)
vpc = vpc_connect(module)
# set values
state = module.params['state']
instance_id = module.params['instance_id']
internet_charge_type = module.params['internet_charge_type']
ip_address = module.params['ip_address']
bandwidth = module.params['bandwidth']
current = None
changed = False
if ip_address:
eips = vpc.get_all_eip_addresses(ip_address=ip_address)
if eips and len(eips) > 0:
current = eips[0]
if state == 'present':
if not current:
try:
client_token = "Ansible-Alicloud-%s-%s" % (hash(str(module.params)), str(time.time()))
current = vpc.allocate_eip_address(bandwidth=bandwidth, internet_charge_type=internet_charge_type,
client_token=client_token)
changed = True
except VPCResponseError as e:
module.fail_json(msg='Unable to allocate an eip address, error: {0}'.format(e))
if bandwidth > 0 and bandwidth != int(current.bandwidth):
try:
changed = current.modify(bandwidth=bandwidth)
except Exception as e:
module.fail_json(msg="Modify EIP bandwidth failed. Error: {0}".format(e))
if instance_id and current.status == 'Available':
try:
changed = current.associate(instance_id=instance_id)
except Exception as e:
module.fail_json(msg="Associate EIP with instance {0} failed. Error: {1}".format(instance_id, e))
module.exit_json(changed=changed, ip_address=current.ip_address, allocation_id=current.id,
instance_id=current.instance_id, eip=get_eip(current))
else:
if instance_id:
try:
changed = current.disassociate(instance_id=instance_id)
module.exit_json(changed=changed, ip_address=current.ip_address, allocation_d=current.id, eip=get_eip(current))
except Exception as e:
module.fail_json(msg="Disassociate EIP with instance {0} failed. Error: {1}".format(instance_id, e))
#release
try:
changed = current.release()
except Exception as e:
module.fail_json(msg="Disassociate EIP with instance {0} failed. Error: {1}".format(instance_id, e))
module.exit_json(changed=changed)
if __name__ == "__main__":
main()