plugins/modules/ali_oos_execution.py (232 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_oos_execution
short_description: Configure Execution Alibaba Cloud Operation Orchestration Service(OOS)
description:
- Create, Delete, Notify, Cancel Execution.
options:
state:
description:
- If I(state=present), execution will be started.
- If I(state=absent), execution will be deleted.
- If I(state=cancel), execution will be canceled.
- If I(state=notify), It will notify a pending execution of how to run next.
choices: ['present', 'absent', 'cancel', 'notify']
type: str
default: 'present'
task_execution_id:
description:
- The id of task execution.
type: str
task_name:
description:
- The name of task execution.
type: str
notify_note:
description:
- The note of notify.
type: str
loop_item:
description:
- Loop child nodes corresponding to Item data.
type: str
execution_status:
description:
- The status of execution.
- Required when C(notify_type=CompleteExecution)
type: str
notify_type:
description:
- The type of notify.
- If C(notify_type=Approve), approval of pending execution. If you know the execution risks of high-risk operations, and allow them to perform.
- If C(notify_type=Reject), reject execution pending approval. If high-risk operations are not allowed to perform tasks.
- If C(notify_type=ExecuteTask), specifies the start of the execution of a task, suitable for Debug mode. May need to cooperate with I(parameters).
- If C(notify_type=CancelTask), cancel current task execution, applicable to when C(mode=Debug).
- If C(notify_type=CompleteExecution), manually terminate execution in a debug mode. Can be used with the I(execution_status) to specify the status of execution termination.
choices: ['Approve', 'Reject', 'ExecuteTask', 'CancelTask', 'CompleteExecution']
type: str
executed_by:
description:
- The user executed execution.
- when you want to cancel,delete or notify executions, you can pass it to filter executions, except it,
filter params supported include (I(template_name), I(status), I(execution_ids))
type: str
status:
description:
- The status of execution.
- when you want to cancel,delete or notify executions, you can pass it to filter executions, except it,
filter params supported include (I(template_name), I(executed_by), I(execution_ids))
type: str
safety_check:
description:
- Security check mode.
- If C(safety_check=Skip), means that the customer understands the risk and can perform any action without confirmation,
regardless of the level of risk. Effective when C(mode=Automatic).
- If C(safety_check=ConfirmEveryHighRiskAction), will ask the customer to confirm each high-risk action.
The client confirms or cancels by calling the NotifyExecution interface.
type: str
default: ConfirmEveryHighRiskAction
choices: ['Skip', 'ConfirmEveryHighRiskAction']
parent_execution_id:
description:
- The id of parent execution.
type: str
parameters:
description:
- Consists of a collection of parameters.
type: dict
mode:
description:
- The execution mode.
type: str
choices: ['Debug', 'Automatic']
loop_mode:
description:
- The Loop mode.
type: str
template_name:
description:
- The name of template.
- when you want to start a execution, It is required.
- when you want to cancel,delete or notify executions, you can pass it to filter executions, except it,
filter params supported include (I(status), I(executed_by), I(execution_ids))
type: str
description:
description:
- The description of execution.
type: str
execution_ids:
description:
- The ids of executions.
- when you want to cancel,delete or notify executions, you can pass it to filter executions, except it,
filter params supported include (I(status), I(executed_by), I(template_name))
type: list
elements: str
tags:
description:
- A hash/dictionaries of template tags. C({"key":"value"})
type: dict
requirements:
- "python >= 3.6"
- "footmark >= 1.20.0"
extends_documentation_fragment:
- alibaba.alicloud.alicloud
author:
- "He Guimin (@xiaozhu36)"
- "Li Xue (@lixue323)"
"""
EXAMPLES = """
# Note: These examples do not set authentication details, see the Alibaba Cloud Guide for details.
- name: Changed. Start a timed execution that starts and closes instances
alibaba.alicloud.ali_oos_execution:
template_name: 'ACS-ECS-ScheduleToStartAndStopInstances'
safety_check: Skip
description: test execution from ansible
parameters:
dailyStartTime: 08:00:00Z
dailyStopTime: dailyStopTime
weekdays: '2'
targets:
Type: ResourceIds
ResourceIds:
- 'instances_id'
tags:
From: ansible
- name: Changed. cancel a timed execution
alibaba.alicloud.ali_oos_execution:
state: cancel
template_name: 'ACS-ECS-ScheduleToStartAndStopInstances'
- name: Changed. Delete a execution
alibaba.alicloud.ali_oos_execution:
state: absent
template_name: 'ACS-ECS-ScheduleToStartAndStopInstances'
- name: Changed. Start a risky execution that deletes instances
alibaba.alicloud.ali_oos_execution:
template_name: 'ACS-ECS-BulkyDeleteInstances'
description: test execution from ansible
parameters:
force: true
targets:
Type: ResourceIds
ResourceIds:
- 'instances_id'
- name: Changed. notify a execution
alibaba.alicloud.ali_oos_execution:
state: notify
notify_type: Approve
template_name: 'ACS-ECS-BulkyDeleteInstances'
- name: Changed. Delete a execution
alibaba.alicloud.ali_oos_execution:
state: absent
template_name: 'ACS-ECS-BulkyDeleteInstances'
"""
RETURN = '''
executions:
description: info about the executions that was started, notified
returned: always
type: complex
contains:
execution_id:
description: The id of execution.
returned: always
type: str
sample: exec-xxxyyy
id:
description: aliases of execution_id.
returned: always
type: str
sample: exec-xxxyyy
is_parent:
description: Have child task or not.
returned: always
type: bool
sample: false
loop_mode:
description: The loop mode.
returned: always
type: str
sample: Automatic
mode:
description: mode of execution.
returned: always
type: str
sample: Automatic
out_puts:
description: The output of execution.
returned: always
type: str
sample: {"InstanceId":"i-xxx"}
parameters:
description: The parameters of execution.
returned: always
type: str
sample: {"Status":"Running"}
parent_execution_id:
description: The id of parent execution.
returned: always
type: str
sample: exec-xxxx
ram_role:
description: The ram role of execution.
returned: always
type: str
sample: OOSServiceRole
safety_check:
description: The security check mode.
returned: always
type: str
sample: Skip
description:
description: The description of execution.
returned: always
type: str
sample: run instance
start_date:
description: The start date of the execution.
returned: always
type: str
sample: "2019-05-16T10:26:14Z"
status:
description: The status of the execution.
returned: always
type: str
sample: Success
status_message:
description: The message of the status.
returned: always
type: str
sample: ""
template_id:
description: The id of the template.
returned: always
type: str
sample: t-1bd341007f
template_name:
description: The name of the template.
returned: always
type: str
sample: MyTemplate
template_version:
description: The version of template.
returned: always
type: str
sample: v1
update_date:
description: The update date of template.
returned: always
type: str
sample: "2019-05-16T10:26:14Z"
executed_by:
description: The template executor.
returned: always
type: str
sample: root(13092080xx12344)
end_date:
description: The end date of execution.
returned: always
type: str
sample: "2019-05-16T10:26:14Z"
task_name:
description: The name of task.
returned: always
type: str
sample: waitForReady
task_execution_id:
description: The id of task execution.
returned: always
type: str
sample: exec-xxxyyy.0001
task_action:
description: The action of task.
returned: always
type: str
sample: ACS::WaitFor
'''
import time
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.alibaba.alicloud.plugins.module_utils.alicloud_ecs import ecs_argument_spec, oos_connect
HAS_FOOTMARK = False
try:
from footmark.exception import OOSResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False
def executions_exists(module, oos_conn):
try:
executions = []
if module.params.get('execution_ids'):
for i in module.params.get('execution_ids'):
executions.extend(oos_conn.list_executions(execution_id=i))
elif module.params.get('params'):
executions.extend(oos_conn.list_executions(**module.params['params']))
ids = []
if executions:
for e in executions:
ids.append(e.id)
else:
module.fail_json(msg="Failed to list executions, please make sure your params are correct")
return ids
except Exception as e:
module.fail_json(msg="Failed to list templates: {0}".format(e))
def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
state=dict(default='present', choices=['present', 'absent', 'cancel', 'notify']),
execution_ids=dict(type='list', elements='str'),
description=dict(type='str'),
template_name=dict(type='str', aliases=['name']),
loop_mode=dict(type='str'),
mode=dict(type='str', choices=['Debug', 'Automatic']),
parameters=dict(type='dict'),
parent_execution_id=dict(type='str'),
safety_check=dict(type='str', default='ConfirmEveryHighRiskAction', choices=['Skip', 'ConfirmEveryHighRiskAction']),
tags=dict(type='dict'),
status=dict(type='str'),
executed_by=dict(type='str'),
notify_type=dict(type='str', choices=['Approve', 'Reject', 'ExecuteTask', 'CancelTask', 'CompleteExecution']),
execution_status=dict(type='str'),
loop_item=dict(type='str'),
notify_note=dict(type='str'),
task_execution_id=dict(type='str'),
task_name=dict(type='str')
))
module = AnsibleModule(argument_spec=argument_spec)
if HAS_FOOTMARK is False:
module.fail_json(msg='footmark required for this module.')
oos_conn = oos_connect(module)
# Get values of variable
state = module.params['state']
template_name = module.params['template_name']
status = module.params['status']
executed_by = module.params['executed_by']
params = {}
if template_name:
params['template_name'] = template_name
if status:
params['status'] = status
if executed_by:
params['executed_by'] = executed_by
changed = False
if params:
module.params['params'] = params
if state == 'absent':
ids = executions_exists(module, oos_conn)
try:
if oos_conn.delete_executions(execution_ids=ids):
changed = True
module.exit_json(changed=changed, executions={})
except OOSResponseError as e:
module.fail_json(msg='Unable to delete executions {0}, error: {1}'.format(str(ids), e))
elif state == 'cancel':
ids = executions_exists(module, oos_conn)
try:
if ids:
for i in ids:
if oos_conn.cancel_execution(execution_id=i):
changed = True
module.exit_json(changed=changed, executions={})
except OOSResponseError as e:
module.fail_json(msg='Unable to cancel executions {0}, error: {1}'.format(str(ids), e))
elif state == 'present':
client_token = "Ansible-Alicloud-{0}-{1}".format(hash(str(module.params)), str(time.time()))
module.params['client_token'] = client_token
execution = oos_conn.start_execution(**module.params)
if execution:
changed = True
module.exit_json(changed=changed, executions=execution.read())
else:
excutions = []
ids = executions_exists(module, oos_conn)
if ids:
for i in ids:
module.params['execution_id'] = i
if oos_conn.notify_execution(**module.params):
changed = True
excutions.append(oos_conn.list_executions(execution_id=i)[0].read())
module.exit_json(changed=changed, excutions=excutions)
if __name__ == '__main__':
main()