lib/ansible/modules/cloud/alicloud/_alicloud_slb_vsg.py (335 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': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: alicloud_slb_vsg
version_added: "2.5"
short_description: Create, Delete VServerGroup and Modify its name or backend servers.
description:
- Create, Delete VServerGroup and Modify its name or backend servers.
deprecated:
removed_in: "1.5.0"
why: Alibaba Cloud module name prefix "ali" will be more concise.
alternative: Use M(ali_slb_vsg) instead.
options:
state:
description:
- The state of the instance after operating.
default: 'present'
choices: [ 'present', 'absent', 'list']
load_balancer_id:
description:
- The unique ID of an Server Load Balancer instance, It is required when need to create a new vserver group.
vserver_group_name:
description:
- Virtual server group name
aliases: [ 'group_name' ]
backend_servers:
description:
- List of backend servers that need to be added.
suboptions:
instance_id:
description:
- The ID of backend server.
required: true
port:
description:
- Port used to backend server
required: true
choices: [1~65536]
weight:
description:
- The weigth of the backend server
default: 100
choices: [1~101]
vserver_group_id:
description:
- Virtual server group id. It is required when need to operate an existing vserver group.
aliases: [ 'group_id' ]
requirements:
- "python >= 2.6"
- "footmark >= 1.1.16"
extends_documentation_fragment:
- alicloud
author:
- "He Guimin (@xiaozhu36)"
- "Liu Qiang"
'''
EXAMPLES = '''
# basic provisioning example to create VServer Group in SLB
- name: Create VServer Group in SLB
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
load_balancer_id: <your-specified-load-balancer>
vserver_group_name: test
backend_servers:
- instance_id: <your-specified-ECS-instance-id>
port: 8080
weight: 100
tasks:
- name: Create VServer Group in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
load_balancer_id: '{{ load_balancer_id }}'
vserver_group_name: '{{ vserver_group_name }}'
backend_servers: '{{ backend_servers }}'
state: present
register: result
- debug: var=result
# basic provisioning example to set VServer Group attribute in SLB
- name: set VServer Group attribute in SLB
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
load_balancer_id: <your-specified-load-balancer>
vserver_group_name: test
backend_servers:
- instance_id: <your-specified-ECS-instance-id>
port: 8080
weight: 100
tasks:
- name: Set VServer Group attribute in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
load_balancer_id: '{{ load_balancer_id }}'
vserver_group_name: '{{ vserver_group_name }}'
backend_servers: '{{ backend_servers }}'
state: present
register: result
- debug: var=result
# basic provisioning example to add VServer Group Backend Servers in SLB
- name: Add VServer Group Backend Servers in SLB
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
vserver_group_id: <your-specified-vserver-group-id>
backend_servers:
- instance_id: <your-specified-ECS-instance-id>
port: 8080
weight: 100
tasks:
- name: Add VServer Group Backend Servers in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
vserver_group_id: '{{ vserver_group_id }}'
backend_servers: '{{ backend_servers }}'
state: present
register: result
- debug: var=result
# basic provisioning example to remove VServer Group Backend Servers in SLB
- name: remove VServer Group Backend Servers in SLB
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
vserver_group_id: <your-specified-vserver-group-id>
backend_servers:
- instance_id: <your-specified-ECS-instance-id>
port: 8080
tasks:
- name: remove VServer Group Backend Servers in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
vserver_group_id: '{{ vserver_group_id }}'
backend_servers: '{{ backend_servers }}'
state: absent
register: result
- debug: var=result
# basic provisioning example to describe VServer Group in SLB
- name: describe VServer Group
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
vserver_group_id: <your-specified-vserver-group-id>
tasks:
- name: Describe VServer Group in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
vserver_group_id: '{{ vserver_group_id }}'
state: list
register: result
- debug: var=result
# basic provisioning example to delete VServer Group in SLB
- name: Delete VServer Group
hosts: localhost
connection: local
vars:
alicloud_access_key: <your-alicloud-access-key>
alicloud_secret_key: <your-alicloud-secret-key>
alicloud_region: ap-southeast-1
vserver_group_id: <your-specified-vserver-group-id>
tasks:
- name: Delete VServer Group in SLB
alicloud_slb_vsg:
alicloud_access_key: '{{ alicloud_access_key }}'
alicloud_secret_key: '{{ alicloud_secret_key }}'
alicloud_region: '{{ alicloud_region }}'
vserver_group_id: '{{ vserver_group_id }}'
state: absent
register: result
- debug: var=result
'''
RETURN = '''
vserver_group:
description:
- The info of vserver_group
returned: when success
type: dict
sample: {
"backend_servers": {
"backend_server": [
{
"port": 80,
"server_id": "i-2ze3ajpeq3y80w4lt4jr",
"weight": 100
}
]
},
"vserver_group_id": "rsp-2zejxvoxensk1",
"vserver_group_name": "Group123"
}
'''
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_FOOTMARK = False
try:
from footmark.exception import SLBResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False
def get_info(obj):
"""
get info from vsg object
:param obj: vsg obj
:return: res: info of vsg
"""
res = {'vserver_group_id': obj.vserver_group_id}
if hasattr(obj, 'backend_servers'):
res['backend_servers'] = obj.backend_servers
if hasattr(obj, 'vserver_group_name'):
res['vserver_group_name'] = obj.vserver_group_name
return res
def convert_to_utf8(obj):
if sys.version_info.major == 3:
return obj
if isinstance(obj, dict):
res = {}
for key, value in obj.iteritems():
res = dict(res, **{convert_to_utf8(key): convert_to_utf8(value)})
return res
elif isinstance(obj, list):
res = []
for i in obj:
res.append(convert_to_utf8(i))
return res
elif type(obj) not in [int, float, bool, complex, long]:
return obj.encode('utf-8')
return obj
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
state=dict(type='str', default='present', choices=['present', 'absent', 'list']),
load_balancer_id=dict(type='str'),
vserver_group_name=dict(type='str', aliases=['group_name']),
backend_servers=dict(type='list'),
vserver_group_id=dict(type='str', aliases=['group_id']),
old_backend_servers=dict(type='list'),
new_backend_servers=dict(type='list')
))
module = AnsibleModule(argument_spec=argument_spec)
if HAS_FOOTMARK is False:
module.fail_json(msg='footmark required for the module alicloud_slb_vsg.')
slb = slb_connect(module)
state = module.params['state']
load_balancer_id = module.params['load_balancer_id']
vserver_group_name = module.params['vserver_group_name']
backend_servers = module.params['backend_servers']
vserver_group_id = module.params['vserver_group_id']
changed = False
current_vserver_group = None
if vserver_group_id:
try:
current_vserver_group = slb.describe_vserver_group_attribute(vserver_group_id)
except Exception as e:
module.fail_json(msg=str("Unable to describe vserver group attribute, error:{0}".format(e)))
if state == "present":
if current_vserver_group:
set_data = []
add_data = []
if backend_servers:
server_info = {}
decode_infos = convert_to_utf8(current_vserver_group.backend_servers)
for info in decode_infos['backend_server']:
server_info[info['port']] = info
for server in backend_servers:
if server['port'] in server_info.keys():
if server_info[server['port']]['weight'] != server['weight']:
set_data.append(server)
else:
add_data.append(server)
if set_data or vserver_group_name:
try:
current_vserver_group.set_attribute(backend_servers=set_data, vserver_group_name=vserver_group_name)
except Exception as e:
module.fail_json(msg=str("Unable to set vserver group attribute, error:{0}".format(e)))
if add_data:
try:
current_vserver_group.add_backend_servers(backend_servers=add_data)
except Exception as e:
module.fail_json(msg=str("Unable to add vserver group backend server, error:{0}".format(e)))
try:
current_vserver_group = slb.describe_vserver_group_attribute(vserver_group_id)
except Exception as e:
module.fail_json(msg=str("Unable to describe vserver group attribute, error:{0}".format(e)))
module.exit_json(changed=True, vserver_group=get_info(current_vserver_group))
else:
try:
current_vserver_group = slb.create_vserver_group(load_balancer_id, vserver_group_name, backend_servers)
except Exception as e:
module.fail_json(msg=str("Unable to create vserver group error:{0}".format(e)))
module.exit_json(changed=True, vserver_group=get_info(current_vserver_group))
if not current_vserver_group:
module.fail_json(msg="The specified vserver group is not exist. Please check your vserver_group_id and try again.")
elif state == "list":
module.exit_json(changed=True, vserver_group=get_info(current_vserver_group))
elif state == 'absent':
if backend_servers:
try:
current_vserver_group = current_vserver_group.remove_backend_servers(backend_servers)
except Exception as e:
module.fail_json(msg=str("Unable to remove vserver group backend server, error:{0}".format(e)))
module.exit_json(changed=True, vserver_group=get_info(current_vserver_group))
else:
try:
changed = current_vserver_group.delete()
except Exception as e:
module.fail_json(msg=str("Unable to delete vserver group, error:{0}".format(e)))
module.exit_json(changed=changed, vserver_group=get_info(current_vserver_group))
if __name__ == '__main__':
main()