lib/ansible/modules/cloud/alicloud/_alicloud_ess_task.py (275 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', 'status': ['deprecated'], 'supported_by': 'community'} DOCUMENTATION = ''' --- module: alicloud_ess_task version_added: "1.0.9" short_description: Create or Terminate an scheduled task in ESS. description: - A scheduled task used to execute scaling activity in a scaling group automatically. - At most 20 scheduled tasks can be specified in a account. - When the trigger of a scheduled task fails because a scaling activity in a scaling group is in progress or the scaling group is disabled, the scheduled task is automatically retried within the LaunchExpirationTime; otherwise, the scheduled trigger task is abandoned. - If multiple tasks are scheduled at similar times to execute the rule of the same group, the earliest task triggers the scaling activity first, and other tasks make attempts to execute the rule within their Launch Expiration Time because a scaling group executes only one scaling activity at a time. If another scheduled task is still making triggering attempts within its Launch Expiration Time after the scaling activity is finished, the scaling rule is executed and the corresponding scaling activity is triggered. deprecated: removed_in: "1.5.0" why: Alibaba Cloud module name prefix "ali" will be more concise. alternative: Use M(ali_ess_task) instead. options: state: description: - present to create a scheduled task and absent to delete it. default: 'present' choices: [ 'present', 'absent' ] rule_id: description: - ID of the scaling rule of a scheduled task. Required when C(state=present) launch_time: description: - Time point at which the scheduled task is triggered. - The date format follows the ISO8601 standard and uses UTC time. It is in the format of YYYY-MM-DDThh:mmZ. - If I(recurrence_type), the time point specified by this attribute is the default time point at which the circle is executed. Otherwise, the task is executed once on the designated date and time. - A time point 90 days after creation or modification cannot be inputted. - Required when C(state=present). launch_expiration: description: - Time period within which the failed scheduled task is retried, in second. Value range [0, 21600]. default: 600 aliases: ['expiration'] name: description: - Display name of the scheduled task. - It must be 2-40 characters (English or Chinese) long, and begin with a number, an upper/lower-case letter or a Chinese character and may contain numbers, "_", "-" or ".". - Default to scheduled task ID. aliases: ['task_name' ] description: description: - Description of the scheduled task, which is 2-200 characters (English or Chinese) long. recurrence_type: description: - Type of the scheduled task to be repeated. Optional values 'Daily', 'Weekly' and 'Monthly' to indicates recurrence interval by day, week or month for a scheduled task. - I(recurrence_type, recurrence_value, recurrence_endtime) must be specified or not at the same time. aliases: [ 'type' ] choices: ['Daily', 'Weekly', 'Monthly'] recurrence_value: description: - Value of the scheduled task to be repeated. - Daily should only supported one value in the range [1,31]. - Weekly support multiple values. The values of Sunday to Saturday are 0 to 6 in sequence. Multiple values shall be separated by a comma ",". - Monthly use format A-B and the value range of A and B is 1 to 31, and the B value must be greater than the A value. - I(recurrence_type, recurrence_value, recurrence_endtime) must be specified or not at the same time. aliases: [ 'value' ] recurrence_endtime: description: - End time of the scheduled task to be repeated. The date format follows the ISO8601 standard and uses UTC time. It is in the format of YYYY-MM-DDThh:mmZ. A time point 90 days after creation or modification cannot be inputted. - I(recurrence_type, recurrence_value, recurrence_endtime) must be specified or not at the same time. aliases: [ 'endtime' ] enabled: description: - Whether to enable the scheduled task. default: True type: bool id: description: - The ID of existing scheduled task. aliases: [ 'task_id' ] author: - "He Guimin (@xiaozhu36)" requirements: - "python >= 2.6" - "footmark >= 1.3.0" extends_documentation_fragment: - alicloud ''' EXAMPLES = ''' - name: basic provisioning example hosts: localhost vars: alicloud_access_key: <your-alicloud-access-key-id> alicloud_secret_key: <your-alicloud-access-secret-key> alicloud_region: cn-beijing rule_id: asr-2zefe4bi0jpctd6z726p launch_time: 2018-01-09T15:00Z launch_expiration: 300 recurrence_type: 'Daily' recurrence_value: 10 recurrence_endtime: 2018-02-10T15:00Z name: task-from-ansible tasks: - name: launch scheduled task alicloud_ess_task: alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' alicloud_region: '{{ alicloud_region }}' name: '{{ name }}' rule_id: '{{ rule.id }}' launch_time: '{{ launch_time }}' launch_expiration: '{{ launch_expiration }}' recurrence_type: '{{ recurrence_type }}' recurrence_value: '{{ recurrence_value }}' recurrence_endtime: '{{ recurrence_endtime }}' - name: delete specified scheduled task alicloud_ess_task: alicloud_access_key: '{{ alicloud_access_key }}' alicloud_secret_key: '{{ alicloud_secret_key }}' alicloud_region: '{{ alicloud_region }}' name: '{{ name }}' state: absent ''' RETURN = ''' id: description: Scheduled Task ID. returned: expect absent type: str sample: "cItPa1ec7ii6dryMmEbBnJZP" name: description: Scheduled Task name. returned: expect absent type: str sample: ess-task-foo task: description: The details of a scheduled task. returned: expect absent type: dict sample: { "description": null, "enabled": true, "id": "cItPa1ec7ii6dryMmEbBnJZP", "launch_expiration": 300, "launch_time": "2018-01-09T15:00Z", "name": "ess-task-foo", "recurrence_endtime": "2018-02-10T15:00Z", "recurrence_type": "Daily", "recurrence_value": "10", "rule_ari": "ari:acs:ess:cn-beijing:1204663572767468:scalingrule/asr-2zefe4bi0jpctd6z726p" } ''' from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.alicloud_ecs import ecs_argument_spec, ess_connect HAS_FOOTMARK = False try: from footmark.exception import ECSResponseError HAS_FOOTMARK = True except ImportError: HAS_FOOTMARK = False def get_details(task): return dict(id=task.id, name=task.name, rule_ari=task.rule_ari, description=getattr(task, 'description', None), launch_time=task.launch_time, launch_expiration=task.launch_expiration, recurrence_type=task.recurrence_type, recurrence_value=task.recurrence_value, recurrence_endtime=task.recurrence_end_time, enabled=task.enabled, ) def main(): argument_spec = ecs_argument_spec() argument_spec.update(dict( rule_id=dict(type='str'), launch_time=dict(type='str'), launch_expiration=dict(type='int', defalut=600, aliases=['expiration']), name=dict(type='str', aliases=['task_name']), description=dict(type='str'), recurrence_type=dict(type='str', choices=['Daily', 'Weekly', 'Monthly'], aliases=['type']), recurrence_value=dict(type='str', aliases=['value']), recurrence_endtime=dict(type='str', aliases=['endtime']), state=dict(type='str', default='present', choices=['present', 'absent']), enabled=dict(type='bool', default=True), id=dict(type='str', aliases=['task_id']) )) module = AnsibleModule(argument_spec=argument_spec) if HAS_FOOTMARK is False: module.fail_json(msg="Package 'footmark' required for the module alicloud_ess_task.") ess = ess_connect(module) state = module.params['state'] task_id = module.params['id'] task_name = module.params['name'] rule_id = module.params['rule_id'] launch_time = module.params['launch_time'] launch_expiration = module.params['launch_expiration'] recurrence_type = module.params['recurrence_type'] recurrence_value = module.params['recurrence_value'] recurrence_endtime = module.params['recurrence_endtime'] enabled = module.params['enabled'] description = module.params['description'] # Get scaling rule ari according rule ID rule_ari = None if rule_id: rules = ess.describe_rules(scaling_rule_ids=[rule_id]) rule_ari = rules[0].ari count = 0 if recurrence_type: count += 1 if recurrence_value: count += 1 if recurrence_endtime: count += 1 if count in (1, 2): module.fail_json(msg="'recurrence_type', 'recurrence_value' and 'recurrence_endtime' must be specified or not at the same time") changed = False current = None all_tasks = [] if task_id or task_name: tasks = ess.describe_scheduled_tasks(scheduled_task_ids=[task_id], scheduled_task_names=[task_name], scaling_rule_aris=[rule_ari]) if tasks: if len(tasks) > 1: for task in tasks: all_tasks.append(task.id) module.fail_json(msg="There are several scheduled tasks in our record based on name {0}: {1}. " "Please specified one using 'id' and try again.".format(task_name, all_tasks)) current = tasks[0] if state == 'present': if current is None: try: if not rule_id: module.exit_json(msg="'rule_id': required field when state is present, aborting.") if not rule_ari: module.exit_json(msg="There is no scheduled task in our record based on rule id {0}, aborting." "Please check it and try again.".format(rule_id)) if not launch_time: module.exit_json(msg="'launch_time': required field when state is present, aborting.") current = ess.create_scheduled_task(scaling_rule_ari=rule_ari, launch_time=launch_time, name=task_name, description=description, launch_expiration_time=launch_expiration, recurrence_type=recurrence_type, recurrence_value=recurrence_value, recurrence_end_time=recurrence_endtime, task_enabled=enabled) changed = True except Exception as e: module.fail_json(msg="Create scheduled task got an error: {0}".format(e)) else: try: changed = current.modify(scaling_rule_ari=rule_ari, launch_time=launch_time, name=task_name, description=description, launch_expiration_time=launch_expiration, recurrence_type=recurrence_type, recurrence_value=recurrence_value, recurrence_end_time=recurrence_endtime, task_enabled=enabled) if changed: current = current.update(validate=True) except Exception as e: module.fail_json(msg="Modify scheduled rule got an error: {0}".format(e)) module.exit_json(changed=changed, id=current.id, name=current.name, task=get_details(current)) if current is None: if task_id or task_name: module.fail_json(msg="There are no scheduled task in our record based on id {0} or name {1}. " "Please check it and try again.".format(task_id, task_name)) module.fail_json(msg='Please specify a scheduled task that you want to terminate by field id or name, aborting') try: module.exit_json(changed=current.terminate()) except Exception as e: module.fail_json(msg='Delete scheduled task {0} got an error: {1}'.format(current.id, e)) if __name__ == '__main__': main()