lib/ansible/modules/cloud/alicloud/_alicloud_slb_lb.py (217 lines of code) (raw):

#!/usr/bin/python # Copyright (c) 2017-present Alibaba Group Holding Limited. He Guimin <heguimin36@163.com.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', 'status': ['deprecated'], 'supported_by': 'community'} DOCUMENTATION = """ --- module: alicloud_slb_lb version_added: "1.0.9" short_description: Create, Delete, Enable or Disable Server Load Balancer in ECS. description: - Create, Delete, Enable or Disable Server Load Balancer in ECS. deprecated: removed_in: "1.5.0" why: Alibaba Cloud module name prefix "ali" will be more concise. alternative: Use M(ali_slb_lb) instead. options: state: description: - The state of the instance after operating. default: 'present' choices: [ 'present', 'absent', 'running', 'stopped'] load_balancer_name: description: - The name of the server load balancer, which is a string of 1 to 80 characters. It can contain numerals, "_", "/", "." or "-". aliases: [ 'name' ] load_balancer_id: description: - This parameter is required when user wants to perform edit operation in Load Balancer aliases: ['id'] load_balancer_status: description: - (deprecated) The field has been deprecated from ansible-alicloud v1.1.3. address_type: description: - (deprecated) The field has been deprecated from ansible-alicloud v1.1.3 and 'is_internet' will replace. is_internet: description: - Load balancer network type whether is internet. type: bool default: Ture vswitch_id: description: - The vswitch id of the VPC instance. aliases: ['subnet_id'] internet_charge_type: description: - The charge type of internet. It will be ignored when C(is_internet=False) default: 'paybytraffic' choices: ['paybybandwidth', 'paybytraffic'] master_zone_id: description: - The main usable area ID of the created Load Balancer can be found by the DescribeZone interface slave_zone_id: description: - The ID of the standby zone of the created Load Balancer can be found on the DescribeZone interface bandwidth: description: - Bandwidth peak of the public network instance charged per fixed bandwidth. It will be ignored when C(internet_charge_type=paybytraffic) default: 1 choices: [ 1-1000 Mbps ] requirements: - "python >= 2.6" - "footmark >= 1.1.18" extends_documentation_fragment: - alicloud author: - "He Guimin (@xiaozhu36)" - "Liu Qiang" """ EXAMPLES = ''' # Basic provisioning example to create Load Balancer - name: create server load balancer hosts: localhost connection: local vars: alicloud_region: cn-beijing alicloud_access_key: <your-alicloud-access-key-id> alicloud_secret_key: <your-alicloud-access-secret-key> load_balancer_name: demo_slb internet_charge_type: paybytraffic state: present tasks: - name: create server load balancer alicloud_slb_lb: alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' alicloud_region: '{{ alicloud_region }}' load_balancer_name: '{{ load_balancer_name }}' address_type: '{{ address_type }}' internet_charge_type: '{{ internet_charge_type }}' state: '{{ state }}' register: result - debug: var=result # Basic provisioning example to Modify SLB Internet Specification - name: modify server load balancer internet specification hosts: localhost connection: local vars: alicloud_region: cn-beijing alicloud_access_key: <your-alicloud-access-key-id> alicloud_secret_key: <your-alicloud-access-secret-key> load_balancer_id: <your-specified-load-balancer> internet_charge_type: paybytraffic bandwidth: 5 tasks: - name: modify server load balancer internet specification alicloud_slb_lb: alicloud_region: '{{ alicloud_region }}' alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' load_balancer_id: '{{ load_balancer_id }}' internet_charge_type: '{{ internet_charge_type }}' bandwidth: '{{ bandwidth }}' register: result - debug: var=result # Basic provisioning example to Delete Server Load Balancer - name: delete server load balancer hosts: localhost connection: local vars: alicloud_region: cn-beijing alicloud_access_key: <your-alicloud-access-key-id> alicloud_secret_key: <your-alicloud-access-secret-key> load_balancer_id: <your-specified-load-balancer> state : absent tasks: - name: delete server load balancer alicloud_slb_lb: alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' alicloud_region: '{{ alicloud_region }}' load_balancer_id: '{{ load_balancer_id }}' state: '{{ state }}' register: result - debug: var=result # Basic provisioning example to set Server Load Balancer Name - name: set server load balancer name hosts: localhost connection: local vars: alicloud_region: cn-beijing alicloud_access_key: <your-alicloud-access-key-id> alicloud_secret_key: <your-alicloud-access-secret-key> load_balancer_id: <your-specified-load-balancer> load_balancer_name: slb_new_name state : present tasks: - name: set server load balancer name alicloud_slb_lb: alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' alicloud_region: '{{ alicloud_region }}' load_balancer_id: '{{ load_balancer_id }}' load_balancer_name: '{{ load_balancer_name }}' state: '{{ state }}' register: result - debug: var=result ''' RETURN = ''' load_balancer: description: - Describe the current info of load_balancer after user operate a load_balancer returned: on present type: string sample: { "address": "101.201.177.136", "bandwidth": null, "internet_charge_type": "4", "id": "lb-2zekcf2uvij5yw3a7t1c3", "name": "test_change_name", "status": "active", "network_type": "classic" } load_balancer_id: description: - Unique identification of load balancing instance returned: on present or absent type: string sample: "lb-2zekcf2uvij5yw3a7t1c3" ''' import time import sys from ast import literal_eval from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.alicloud_ecs import get_acs_connection_info, ecs_argument_spec, slb_connect HAS_ECS = False HAS_FOOTMARK = False try: from footmark.exception import SLBResponseError HAS_FOOTMARK = True except ImportError: HAS_FOOTMARK = False def get_info(lb_obj): """ get info from lb object :param lb_obj: lb obj :return: info of lb """ return dict(id=lb_obj.load_balancer_id, name=lb_obj.load_balancer_name, address=lb_obj.address, internet_charge_type=lb_obj.internet_charge_type, bandwidth=lb_obj.bandwidth, load_balancer_status=lb_obj.load_balancer_status, network_type=lb_obj.network_type) def main(): argument_spec = ecs_argument_spec() argument_spec.update(dict( internet_charge_type=dict(type='str', required=False, choices=['paybybandwidth', 'paybytraffic'], default='paybytraffic'), state=dict(type='str', required=True, choices=['present', 'absent', 'running', 'stopped']), load_balancer_name=dict(type='str', required=False, aliases=['name']), load_balancer_id=dict(type='str', required=False, aliases=['id']), is_internet=dict(type='bool', required=False, default=True), bandwidth=dict(type='int', required=False, default=1), vswitch_id=dict(type='str', required=False, aliases=['subnet_id']), master_zone_id=dict(type='str', required=False), slave_zone_id=dict(type='str', required=False) )) module = AnsibleModule(argument_spec=argument_spec) if HAS_FOOTMARK is False: module.fail_json(msg='footmark required for the module alicloud_slb_lb.') slb = slb_connect(module) state = module.params['state'] load_balancer_id = module.params['load_balancer_id'] load_balancer_name = module.params['load_balancer_name'] is_internet = module.params['is_internet'] vswitch_id = module.params['vswitch_id'] master_zone_id = module.params['master_zone_id'] slave_zone_id = module.params['slave_zone_id'] internet_charge_type = module.params['internet_charge_type'] bandwidth = module.params['bandwidth'] changed = False cur_slb = None if load_balancer_id and load_balancer_name: name_test = "" else: name_test = load_balancer_name res_objs = slb.describe_load_balancers(load_balancer_id=load_balancer_id, load_balancer_name=name_test) if len(res_objs) == 1: cur_slb = slb.describe_load_balancer_attribute(res_objs[0].id) if state == "present": if cur_slb: if load_balancer_name != cur_slb.name: changed = cur_slb.modify_name(load_balancer_name) if changed: cur_slb.load_balancer_name = load_balancer_name if internet_charge_type != cur_slb.internet_charge_type or \ (cur_slb.internet_charge_type == "paybybandwidth" and bandwidth != cur_slb.bandwidth): print (cur_slb.__dict__) print (cur_slb.internet_charge_type, cur_slb.bandwidth) changed = cur_slb.modify_spec(internet_charge_type=internet_charge_type, bandwidth=bandwidth) if changed: cur_slb.internet_charge_type = internet_charge_type cur_slb.bandwidth = bandwidth else: client_token = "Ansible-Alicloud-%s-%s" % (hash(str(module.params)), str(time.time())) address_type = "internet" if not is_internet: address_type = "intranet" cur_slb = slb.create_load_balancer(load_balancer_name=load_balancer_name, address_type=address_type, vswitch_id=vswitch_id, internet_charge_type=internet_charge_type, master_zone_id=master_zone_id, slave_zone_id=slave_zone_id, bandwidth=bandwidth, client_token=client_token) changed = True module.exit_json(changed=changed, load_balancer=get_info(cur_slb), load_balancer_id=cur_slb.id) if not cur_slb: module.fail_json(msg="The specified load balancer is not exist. Please check your load_balancer_id or load_balancer_name and try again.") if state == "absent": changed = cur_slb.delete() module.exit_json(changed=changed, load_balancer_id=cur_slb.load_balancer_id) if state == "running": if cur_slb.status != "active": changed = cur_slb.set_status("active") if changed: cur_slb.load_balancer_status = "active" module.exit_json(changed=changed, load_balancer=get_info(cur_slb), load_balancer_id=cur_slb.load_balancer_id) if state == "stopped": if cur_slb.status != "inactive": changed = cur_slb.set_status("inactive") if changed: cur_slb.load_balancer_status = "inactive" module.exit_json(changed=changed, load_balancer=get_info(cur_slb), load_balancer_id=cur_slb.load_balancer_id) if __name__ == "__main__": main()