plugins/modules/ali_slb_server_info.py (94 lines of code) (raw):
#!/usr/bin/python
# Copyright (c) 2017-present Alibaba Group Holding Limited. <xiaozhu36>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = """
---
module: ali_slb_server_info
short_description: Gather facts on backend server of Alibaba Cloud SLB.
description:
- This module fetches data from the Open API in Alicloud.
The module must be called from within the SLB backend server itself.
options:
load_balancer_id:
description:
- ID of server load balancer.
required: true
aliases: ["lb_id" ]
type: str
listener_ports:
description:
- A list of backend server listening ports.
aliases: ["ports"]
type: list
elements: int
author:
- "He Guimin (@xiaozhu36)"
requirements:
- "python >= 3.6"
- "footmark >= 1.15.0"
extends_documentation_fragment:
- alibaba.alicloud.alicloud
"""
EXAMPLES = '''
# Fetch backend server health status details according to setting different filters
- name: Find all backend server health status in specified region
alibaba.alicloud.ali_slb_server_info:
load_balancer_id: '{{ load_balancer_id }}'
- name: Find all backend server health status based on specified port no.
alibaba.alicloud.ali_slb_server_info:
load_balancer_id: '{{ load_balancer_id }}'
listener_ports: '{{ ports }}'
'''
RETURN = '''
load_balancer_id:
description: ID of the load balancer.
returned: when success
type: str
sample: "lb-dj1jywbux1zslfna6pvnv"
"backend_servers":
description: Details about the backened-servers that were added.
returned: when success
type: list
sample: [
{
"id": "i-2ze35dldjc05dcvezgwk",
"listener_port": 80,
"port": 80,
"server_health_status": "unavailable"
},
{
"id": "i-2ze35dldjc05dcvezgwk",
"listener_port": 8080,
"port": 8080,
"server_health_status": "unavailable"
},
{
"id": "i-2ze35dldjc05dcvezgwk",
"listener_port": 8085,
"port": 8085,
"server_health_status": "unavailable"
}
]
'''
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.alibaba.alicloud.plugins.module_utils.alicloud_ecs import ecs_argument_spec, slb_connect
try:
from footmark.exception import SLBResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False
def get_info(backend_server):
"""
get info from backend server object
:param backend_server: backend server object
:return: info of backend server
"""
return {
'id': backend_server.server_id,
'port': backend_server.port,
'listener_port': backend_server.listener_port,
'server_health_status': backend_server.server_health_status,
}
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
load_balancer_id=dict(required=True, aliases=['lb_id']),
listener_ports=dict(type='list', elements='int', aliases=['ports']),
))
module = AnsibleModule(argument_spec=argument_spec)
if HAS_FOOTMARK is False:
module.fail_json(msg="Package 'footmark' required for this module.")
load_balancer_id = module.params['load_balancer_id']
ports = module.params['listener_ports']
result = []
if ports and (not isinstance(ports, list) or len(ports)) < 1:
module.fail_json(msg='backend_server_ports should be a list of backend server ports, aborting')
try:
slb = slb_connect(module)
# check whether server load balancer exist or not
laod_balancer = slb.describe_load_balancers(load_balancer_id=load_balancer_id)
if laod_balancer and len(laod_balancer) == 1:
if ports:
# list slb servers by port no.
for port in ports:
for backend_server in slb.describe_backend_servers_health_status(
load_balancer_id=load_balancer_id, port=port):
result.append(get_info(backend_server))
else:
# list all slb servers
for backend_server in slb.describe_backend_servers_health_status(load_balancer_id=load_balancer_id):
result.append(get_info(backend_server))
module.exit_json(changed=False, load_balancer_id=load_balancer_id, backend_servers=result)
else:
module.fail_json(msg="Unable to list slb backend server health status, invalid load balancer id")
except Exception as e:
module.fail_json(msg="Unable to list slb backend server health status, and got an error: {0}.".format(e))
if __name__ == '__main__':
main()