win_scheduled_task: rewrite (#28995)
* win_scheduled_task: rewrite for additionality functionality and bug fixes * fixes for docs and os version differences * started with the testing * doc fix * added more tests * added principals tests * finished tests for win_scheduled_task rewrite * feedback from PR * change to fail when both new and deprecated args are set * change diff variable to match new standard and update doc sentance
This commit is contained in:
parent
31daeb4b85
commit
838f39e76a
11 changed files with 3547 additions and 397 deletions
File diff suppressed because it is too large
Load diff
|
@ -1,22 +1,9 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# This file is part of Ansible
|
# 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/>.
|
|
||||||
|
|
||||||
# this is a windows documentation stub. actual code lives in the .ps1
|
# Copyright (c) 2017 Ansible Project
|
||||||
# file of the same name
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
||||||
'status': ['preview'],
|
'status': ['preview'],
|
||||||
|
@ -26,138 +13,482 @@ ANSIBLE_METADATA = {'metadata_version': '1.1',
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: win_scheduled_task
|
module: win_scheduled_task
|
||||||
author: "Peter Mounce"
|
|
||||||
version_added: "2.0"
|
version_added: "2.0"
|
||||||
short_description: Manage scheduled tasks
|
short_description: Manage scheduled tasks
|
||||||
description:
|
description:
|
||||||
- Manage scheduled tasks
|
- Creates/modified or removes Windows scheduled tasks.
|
||||||
notes:
|
notes:
|
||||||
- This module requires Windows Server 2012 or later.
|
- In Ansible 2.4 and earlier, this could only be run on Server 2012/Windows 8
|
||||||
|
or newer. Since 2.5 this restriction has been lifted.
|
||||||
|
- The option names and structure for actions and triggers of a service follow
|
||||||
|
the C(RegisteredTask) naming standard and requirements, it would be useful to
|
||||||
|
read up on this guide if coming across any issues U(https://msdn.microsoft.com/en-us/library/windows/desktop/aa382542.aspx).
|
||||||
options:
|
options:
|
||||||
|
# module definition options
|
||||||
name:
|
name:
|
||||||
description:
|
description: The name of the scheduled task without the path.
|
||||||
- Name of the scheduled task
|
|
||||||
required: true
|
required: true
|
||||||
description:
|
|
||||||
description:
|
|
||||||
- The description for the scheduled task
|
|
||||||
enabled:
|
|
||||||
description:
|
|
||||||
- Enable/disable the task
|
|
||||||
choices:
|
|
||||||
- yes
|
|
||||||
- no
|
|
||||||
default: yes
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- State that the task should become
|
|
||||||
required: true
|
|
||||||
choices:
|
|
||||||
- present
|
|
||||||
- absent
|
|
||||||
user:
|
|
||||||
description:
|
|
||||||
- User to run the scheduled task as; defaults to the current user
|
|
||||||
default: DOMAIN\user
|
|
||||||
password:
|
|
||||||
description:
|
|
||||||
- Password for the user account to run the scheduled task as. This is required for running a task without the user being
|
|
||||||
logged in, excluding Windows built-in service accounts. This should be used for specifying credentials during initial
|
|
||||||
task creation, and changing stored user credentials, as setting this value will cause the task to be recreated.
|
|
||||||
version_added: "2.4"
|
|
||||||
runlevel:
|
|
||||||
description:
|
|
||||||
- The level of user rights used to run the task
|
|
||||||
default: limited
|
|
||||||
choices:
|
|
||||||
- limited
|
|
||||||
- highest
|
|
||||||
version_added: "2.4"
|
|
||||||
store_password:
|
|
||||||
description:
|
|
||||||
- Store the password for the user running the task. If C(false), the task will only have access to local resources.
|
|
||||||
default: true
|
|
||||||
version_added: "2.4"
|
|
||||||
executable:
|
|
||||||
description:
|
|
||||||
- Command the scheduled task should execute
|
|
||||||
aliases: [ execute ]
|
|
||||||
arguments:
|
|
||||||
description:
|
|
||||||
- Arguments to provide scheduled task action
|
|
||||||
aliases: [ argument ]
|
|
||||||
frequency:
|
|
||||||
description:
|
|
||||||
- The frequency of the command, not idempotent
|
|
||||||
choices:
|
|
||||||
- once
|
|
||||||
- daily
|
|
||||||
- weekly
|
|
||||||
time:
|
|
||||||
description:
|
|
||||||
- Time to execute scheduled task, not idempotent
|
|
||||||
days_of_week:
|
|
||||||
description:
|
|
||||||
- Days of the week to run a weekly task, not idempotent
|
|
||||||
path:
|
path:
|
||||||
description:
|
description:
|
||||||
- Task folder in which this task will be stored - creates a non-existent path when C(state) is C(present),
|
- Task folder in which this task will be stored.
|
||||||
and removes an empty path when C(state) is C(absent)
|
- Will create the folder when C(state=present) and the folder does not
|
||||||
default: '\'
|
already exist.
|
||||||
|
- Will remove the folder when C(state=absent) and there are no tasks left
|
||||||
|
in the folder.
|
||||||
|
default: \
|
||||||
|
state:
|
||||||
|
description:
|
||||||
|
- When C(state=present) will ensure the task exists.
|
||||||
|
- When C(state=absent) will ensure the task does not exist.
|
||||||
|
choices: [ absent, present ]
|
||||||
|
default: present
|
||||||
|
|
||||||
|
# Action options
|
||||||
|
actions:
|
||||||
|
description:
|
||||||
|
- A list of action to configure for the task.
|
||||||
|
- See suboptions for details on how to construct each list entry.
|
||||||
|
- When creating a task there MUST be at least one action but when deleting
|
||||||
|
a task this can be a null or an empty list.
|
||||||
|
- The ordering of this list is important, the module will ensure the order
|
||||||
|
is kept when modifying the task.
|
||||||
|
- This module only supports the C(ExecAction) type but can still delete the
|
||||||
|
older legacy types.
|
||||||
|
suboptions:
|
||||||
|
path:
|
||||||
|
description:
|
||||||
|
- The path to the executable for the ExecAction.
|
||||||
|
required: true
|
||||||
|
arguments:
|
||||||
|
description:
|
||||||
|
- An argument string to supply for the executable.
|
||||||
|
working_directory:
|
||||||
|
description:
|
||||||
|
- The working directory to run the executable from.
|
||||||
|
version_added: '2.5'
|
||||||
|
arguments:
|
||||||
|
description:
|
||||||
|
- Arguments to provide for a scheduled task action.
|
||||||
|
- DEPRECATED since 2.5, use the C(actions) option instead to specify a list
|
||||||
|
of actions to run.
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
aliases: [ argument ]
|
||||||
|
executable:
|
||||||
|
description:
|
||||||
|
- The path to the executable to run for a scheduled task action.
|
||||||
|
- DEPRECATED since 2.5, use the C(actions) option instead to specify a list
|
||||||
|
of actions to run.
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
|
||||||
|
# Trigger options
|
||||||
|
triggers:
|
||||||
|
description:
|
||||||
|
- A list of triggers to configure for the task.
|
||||||
|
- See suboptions for details on how to construct each list entry.
|
||||||
|
- The ordering of this list is important, the module will ensure the order
|
||||||
|
is kept when modifying the task.
|
||||||
|
- There are multiple types of triggers, see U(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383868.aspx)
|
||||||
|
for a list of trigger types and their options.
|
||||||
|
- The suboption options listed below are not required for all trigger
|
||||||
|
types, read the description for more details.
|
||||||
|
suboptions:
|
||||||
|
type:
|
||||||
|
description:
|
||||||
|
- The trigger type, this value controls what below options are
|
||||||
|
required.
|
||||||
|
required: true
|
||||||
|
choices: [ boot, daily, event, idle, logon, monthlydow, monthly, registration, time, weekly, session_state_change ]
|
||||||
|
enabled:
|
||||||
|
description:
|
||||||
|
- Whether to set the trigger to enabled or disabled
|
||||||
|
- Used in all trigger types.
|
||||||
|
type: bool
|
||||||
|
start_boundary:
|
||||||
|
description:
|
||||||
|
- The start time for the task, even if the trigger meets the other
|
||||||
|
start criteria, it won't start until this time is met.
|
||||||
|
- If you wish to run a task at 9am on a day you still need to specify
|
||||||
|
the date on which the trigger is activated, you can set any date even
|
||||||
|
ones in the past.
|
||||||
|
- Required when C(type) is C(daily), C(monthlydow), C(monthly),
|
||||||
|
C(time), C(weekly), (session_state_change).
|
||||||
|
- Optional for the rest of the trigger types.
|
||||||
|
- This is in ISO 8601 DateTime format C(YYYY-MM-DDThh:mm:ss).
|
||||||
|
end_boundary:
|
||||||
|
description:
|
||||||
|
- The end time for when the trigger is deactivated.
|
||||||
|
- This is in ISO 8601 DateTime format C(YYYY-MM-DDThh:mm:ss).
|
||||||
|
execution_time_limit:
|
||||||
|
description:
|
||||||
|
- The maximum amount of time that the task is allowed to run for.
|
||||||
|
- Optional for all the trigger types.
|
||||||
|
- Is in the ISO 8601 Duration format C(P[n]Y[n]M[n]DT[n]H[n]M[n]S).
|
||||||
|
delay:
|
||||||
|
description:
|
||||||
|
- The time to delay the task from running once the trigger has been
|
||||||
|
fired.
|
||||||
|
- Optional when C(type) is C(event), C(logon), C(registration),
|
||||||
|
C(session_state_change).
|
||||||
|
- Is in the ISO 8601 Duration format C(P[n]Y[n]M[n]DT[n]H[n]M[n]S).
|
||||||
|
random_delay:
|
||||||
|
description:
|
||||||
|
- The delay time that is randomly added to the start time of the
|
||||||
|
trigger.
|
||||||
|
- Optional when C(type) is C(daily), C(monthlydow), C(monthly),
|
||||||
|
C(time), C(weekly).
|
||||||
|
- Is in the ISO 8601 Duration format C(P[n]Y[n]M[n]DT[n]H[n]M[n]S).
|
||||||
|
subscription:
|
||||||
|
description:
|
||||||
|
- Only used and is required for C(type=event).
|
||||||
|
- The XML query string that identifies the event that fires the
|
||||||
|
trigger.
|
||||||
|
user_id:
|
||||||
|
description:
|
||||||
|
- The username that the trigger will target.
|
||||||
|
- Optional when C(type) is C(logon), C(session_state_change).
|
||||||
|
- Can be the username or SID of a user.
|
||||||
|
- When C(type=logon) and you want the trigger to fire when a user in a
|
||||||
|
group logs on, leave this as null and set C(group) to the group you
|
||||||
|
wish to trigger.
|
||||||
|
days_of_week:
|
||||||
|
description:
|
||||||
|
- The days of the week for the trigger.
|
||||||
|
- Can be a list or comma separated string of full day names e.g. monday
|
||||||
|
instead of mon.
|
||||||
|
- Required when C(type) is C(weekly), C(type=session_state_change).
|
||||||
|
- Optional when C(type=monthlydow).
|
||||||
|
days_of_month:
|
||||||
|
description:
|
||||||
|
- The days of the month from 1 to 31 for the triggers.
|
||||||
|
- If you wish to set the trigger for the last day of any month
|
||||||
|
use C(run_on_last_day_of_month).
|
||||||
|
- Can be a list or comma separated string of day numbers.
|
||||||
|
- Required when C(type=monthly).
|
||||||
|
weeks_of_month:
|
||||||
|
description:
|
||||||
|
- The weeks of the month for the trigger.
|
||||||
|
- Can be a list or comma separated string of the numbers 1 to 4
|
||||||
|
representing the first to 4th week of the month.
|
||||||
|
- Optional when C(type=monthlydow).
|
||||||
|
months_of_year:
|
||||||
|
description:
|
||||||
|
- The months of the year for the trigger.
|
||||||
|
- Can be a list or comma separated string of full month names e.g.
|
||||||
|
march instead of mar.
|
||||||
|
- Optional when C(type) is C(monthlydow), C(monthly).
|
||||||
|
run_on_last_week_of_month:
|
||||||
|
description:
|
||||||
|
- Boolean value that sets whether the task runs on the last week of the
|
||||||
|
month.
|
||||||
|
- Optional when C(type) is C(monthlydow).
|
||||||
|
type: bool
|
||||||
|
run_on_last_day_of_month:
|
||||||
|
description:
|
||||||
|
- Boolean value that sets whether the task runs on the last day of the
|
||||||
|
month.
|
||||||
|
- Optional when C(type) is C(monthly).
|
||||||
|
type: bool
|
||||||
|
weeks_interval:
|
||||||
|
description:
|
||||||
|
- The interval of weeks to run on, e.g. C(1) means every week while
|
||||||
|
C(2) means every other week.
|
||||||
|
- Optional when C(type=weekly).
|
||||||
|
version_added: '2.5'
|
||||||
|
days_of_week:
|
||||||
|
description:
|
||||||
|
- Days of the week to run a weekly task.
|
||||||
|
- Specify a list or comma separate days in the full version, e.g. monday
|
||||||
|
instead of mon.
|
||||||
|
- DEPRECATED since 2.5, use the C(triggers) option list with the type of
|
||||||
|
C(monthlydow) or C(weekly).
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
frequency:
|
||||||
|
description:
|
||||||
|
- The frequency of the task to run.
|
||||||
|
- DEPRECATED since 2.5, use the C(triggers) option list and specify the
|
||||||
|
type based on the frequency required.
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
choices: [ daily, once, weekly ]
|
||||||
|
time:
|
||||||
|
description:
|
||||||
|
- The start time to execute the scheduled task.
|
||||||
|
- DEPRECATED since 2.5, use the C(triggers) option list and use the
|
||||||
|
C(start_boundary) option to set the start time.
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
|
||||||
|
# Principal options
|
||||||
|
display_name:
|
||||||
|
description:
|
||||||
|
- The name of the user/group that is displayed in the Task Scheduler UI.
|
||||||
|
version_added: '2.5'
|
||||||
|
group:
|
||||||
|
description:
|
||||||
|
- The group that will run the task.
|
||||||
|
- C(group) and C(username) are exclusive to each other and cannot be set
|
||||||
|
at the same time.
|
||||||
|
- C(logon_type) can either be not set or equal C(group).
|
||||||
|
version_added: '2.5'
|
||||||
|
logon_type:
|
||||||
|
description:
|
||||||
|
- The logon method that the task will run with.
|
||||||
|
- C(password) means the password will be stored and the task has access
|
||||||
|
to network resources.
|
||||||
|
- C(s4u) means the existing token will be used to run the task and no
|
||||||
|
password will be stored with the task. Means no network or encrypted
|
||||||
|
files access.
|
||||||
|
- C(interactive_token) means the user must already be logged on
|
||||||
|
interactively and will run in an existing interactive session.
|
||||||
|
- C(group) means that the task will run as a group.
|
||||||
|
- C(service_account) means that a service account like System, Local
|
||||||
|
Service or Network Service will run the task.
|
||||||
|
choices: [ none, password, s4u, interactive_token, group, service_account, token_or_password ]
|
||||||
|
version_added: '2.5'
|
||||||
|
run_level:
|
||||||
|
description:
|
||||||
|
- The level of user rights used to run the task.
|
||||||
|
- If not specified the task will be created with limited rights.
|
||||||
|
choices: [ limited, highest ]
|
||||||
|
version_added: '2.4'
|
||||||
|
aliases: [ runlevel ]
|
||||||
|
username:
|
||||||
|
description:
|
||||||
|
- The user to run the scheduled task as.
|
||||||
|
- Will default to the current user under an interactive token if not
|
||||||
|
specified during creation.
|
||||||
|
aliases: [ user ]
|
||||||
|
password:
|
||||||
|
description:
|
||||||
|
- The password for the user account to run the scheduled task as.
|
||||||
|
- This is required when running a task without the user being logged in,
|
||||||
|
excluding the builtin service accounts.
|
||||||
|
- If set, will always result in a change unless C(update_password) is set
|
||||||
|
to C(no) and no othr changes are required for the service.
|
||||||
|
version_added: '2.4'
|
||||||
|
update_password:
|
||||||
|
description:
|
||||||
|
- Whether to update the password even when not other changes have occured.
|
||||||
|
- When C(yes) will always result in a change when executing the module.
|
||||||
|
type: bool
|
||||||
|
default: 'yes'
|
||||||
|
version_added: '2.5'
|
||||||
|
store_password:
|
||||||
|
description:
|
||||||
|
- Whether to store the password for the user running the task.
|
||||||
|
- If C(no), the task will only have access to local resources.
|
||||||
|
- DEPRECATED since 2.5, use C(logon_type=password) to set whether to store
|
||||||
|
the password for the task.
|
||||||
|
- Will be removed in 2.7.
|
||||||
|
type: bool
|
||||||
|
default: 'yes'
|
||||||
|
version_added: '2.4'
|
||||||
|
|
||||||
|
# RegistrationInfo options
|
||||||
|
author:
|
||||||
|
description:
|
||||||
|
- The author of the task.
|
||||||
|
version_added: '2.5'
|
||||||
|
date:
|
||||||
|
description:
|
||||||
|
- The date when the task was registered.
|
||||||
|
version_added: '2.5'
|
||||||
|
description:
|
||||||
|
description:
|
||||||
|
- The description of the task.
|
||||||
|
version_added: '2.5'
|
||||||
|
source:
|
||||||
|
description:
|
||||||
|
- The source of the task.
|
||||||
|
version_added: '2.5'
|
||||||
|
version:
|
||||||
|
description:
|
||||||
|
- The version number of the task.
|
||||||
|
version_added: '2.5'
|
||||||
|
|
||||||
|
# Settings options
|
||||||
|
allow_demand_start:
|
||||||
|
description:
|
||||||
|
- Whether the task can be started by using either the Run command or the
|
||||||
|
Context menu.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
allow_hard_terminate:
|
||||||
|
description:
|
||||||
|
- Whether the task can be terminated by using TerminateProcess.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
compatibility:
|
||||||
|
description:
|
||||||
|
- The integer value with indicates which version of Task Scheduler a task
|
||||||
|
is compatible with.
|
||||||
|
- C(0) means the task is compatible with the AT command.
|
||||||
|
- C(1) means the task is compatible with Task Scheduler 1.0.
|
||||||
|
- C(2) means the task is compatible with Task Scheduler 2.0.
|
||||||
|
choices: [ 0, 1, 2 ]
|
||||||
|
version_added: '2.5'
|
||||||
|
delete_expired_task_after:
|
||||||
|
description:
|
||||||
|
- The amount of time that the Task Scheduler will wait before deleting the
|
||||||
|
task after it expires.
|
||||||
|
- A task expires after the end_boundary has been exceeded for all triggers
|
||||||
|
associated with the task.
|
||||||
|
- This is in ISO 8601 DateTime format C(YYYY-MM-DDThh:mm:ss).
|
||||||
|
version_added: '2.5'
|
||||||
|
disallow_start_if_on_batteries:
|
||||||
|
description:
|
||||||
|
- Whether the task will not be started if the computer is running on
|
||||||
|
battery power.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
enabled:
|
||||||
|
description:
|
||||||
|
- Whether the task is enabled, the task can only run when C(yes).
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
execution_time_limit:
|
||||||
|
description:
|
||||||
|
- The amount of time allowed to complete the task.
|
||||||
|
- When not set, the time limit is infinite.
|
||||||
|
- This is in ISO 8601 DateTime format C(YYYY-MM-DDThh:mm:ss).
|
||||||
|
version_added: '2.5'
|
||||||
|
hidden:
|
||||||
|
description:
|
||||||
|
- Whether the task will be hidden in the UI.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
mutliple_instances:
|
||||||
|
description:
|
||||||
|
- An integer that indicates the behaviour when starting a task that is
|
||||||
|
already running.
|
||||||
|
- C(0) will start a new instance in parallel with existing instances of
|
||||||
|
that task.
|
||||||
|
- C(1) will wait until other instances of that task to finish running
|
||||||
|
before starting itself.
|
||||||
|
- C(2) will not start a new instance if another is running.
|
||||||
|
- C(3) will stop other instances of the task and start the new one.
|
||||||
|
choices: [ 0, 1, 2, 3 ]
|
||||||
|
version_added: '2.5'
|
||||||
|
priortiy:
|
||||||
|
description:
|
||||||
|
- The priority level (0-10) of the task.
|
||||||
|
- When creating a new task the default if C(7).
|
||||||
|
- See U(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383512.aspx)
|
||||||
|
for details on the priority levels.
|
||||||
|
version_added: '2.5'
|
||||||
|
restart_count:
|
||||||
|
description:
|
||||||
|
- The number of times that the Task Scheduler will attempt to restart the
|
||||||
|
task.
|
||||||
|
version_added: '2.5'
|
||||||
|
restart_interval:
|
||||||
|
description:
|
||||||
|
- How long the Task Scheduler will attempt to restart the task.
|
||||||
|
- If this is set then C(restart_count) must also be set.
|
||||||
|
- The maximum allowed time is 31 days.
|
||||||
|
- The minimum allowed time is 1 minute.
|
||||||
|
- This is in ISO 8601 DateTime format C(YYYY-MM-DDThh:mm:ss).
|
||||||
|
version_added: '2.5'
|
||||||
|
run_only_if_idle:
|
||||||
|
description:
|
||||||
|
- Whether the task will run the task only if the computer is in an idle
|
||||||
|
state.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
run_only_if_network_available:
|
||||||
|
description:
|
||||||
|
- Whether the task will run only when a network is available.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
start_when_available:
|
||||||
|
description:
|
||||||
|
- Whether the task can start at any time after its scheduled time has
|
||||||
|
passed.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
stop_if_going_on_batteries:
|
||||||
|
description:
|
||||||
|
- Whether the task will be stopped if the computer begins to run on battery
|
||||||
|
power.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
wake_to_run:
|
||||||
|
description:
|
||||||
|
- Whether the task will wake the computer when it is time to run the task.
|
||||||
|
type: bool
|
||||||
|
version_added: '2.5'
|
||||||
|
author:
|
||||||
|
- Peter Mounce (@petemounce)
|
||||||
|
- Jordan Borean (@jborean93)
|
||||||
'''
|
'''
|
||||||
|
|
||||||
EXAMPLES = r'''
|
EXAMPLES = r'''
|
||||||
# Create a scheduled task to open a command prompt
|
- name: create a task to open 2 command prompts as SYSTEM
|
||||||
- win_scheduled_task:
|
win_scheduled_task:
|
||||||
name: TaskName
|
name: TaskName
|
||||||
description: open command prompt
|
description: open command prompt
|
||||||
executable: cmd
|
actions:
|
||||||
arguments: -opt1 -opt2
|
- path: cmd.exe
|
||||||
path: \example
|
arguments: /c hostname
|
||||||
time: 9am
|
- path: cmd.exe
|
||||||
frequency: daily
|
arguments: /c whoami
|
||||||
|
triggers:
|
||||||
|
- type: daily
|
||||||
|
start_boundary: 2017-10-09T09:00:00
|
||||||
|
username: SYSTEM
|
||||||
state: present
|
state: present
|
||||||
enabled: yes
|
enabled: yes
|
||||||
user: SYSTEM
|
|
||||||
|
|
||||||
- name: Create a task to run a PowerShell script as NETWORK SERVICE at the highest user rights level
|
- name: create task to run a PS script as NETWORK service on boot
|
||||||
win_scheduled_task:
|
win_scheduled_task:
|
||||||
name: TaskName2
|
name: TaskName2
|
||||||
description: Run a PowerShell script
|
description: Run a PowerShell script
|
||||||
executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
|
actions:
|
||||||
arguments: -ExecutionPolicy Unrestricted -NonInteractive -File C:\TestDir\Test.ps1
|
- path: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
|
||||||
time: 6pm
|
arguments: -ExecutionPolicy Unrestricted -NonInteractive -File C:\TestDir\Test.ps1
|
||||||
frequency: once
|
triggers:
|
||||||
|
- type: boot
|
||||||
|
username: NETWORK SERVICE
|
||||||
|
run_level: highest
|
||||||
state: present
|
state: present
|
||||||
enabled: yes
|
|
||||||
user: NETWORK SERVICE
|
|
||||||
runlevel: highest
|
|
||||||
|
|
||||||
- name: Change the above task to run under a domain user account, storing credentials for the task
|
- name: change above task to run under a domain user account, storing the passwords
|
||||||
win_scheduled_task:
|
win_scheduled_task:
|
||||||
name: TaskName2
|
name: TaskName2
|
||||||
description: Run a PowerShell script
|
username: DOMAIN\User
|
||||||
executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
|
password: Password
|
||||||
arguments: -ExecutionPolicy Unrestricted -NonInteractive -File C:\TestDir\Test.ps1
|
logon_type: password
|
||||||
time: 6pm
|
|
||||||
frequency: once
|
|
||||||
state: present
|
|
||||||
enabled: yes
|
|
||||||
user: DOMAIN\user
|
|
||||||
password: passwordGoesHere
|
|
||||||
runlevel: highest
|
|
||||||
|
|
||||||
- name: Change the above task again, choosing not to store the password for the account
|
- name: change the above task again, choosing not to store the password
|
||||||
win_scheduled_task:
|
win_scheduled_task:
|
||||||
name: TaskName2
|
name: TaskName2
|
||||||
description: Run a PowerShell script
|
username: DOMAIN\User
|
||||||
executable: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
|
logon_type: s4u
|
||||||
arguments: -ExecutionPolicy Unrestricted -NonInteractive -File C:\TestDir\Test.ps1
|
|
||||||
time: 6pm
|
- name: create task with multiple triggers
|
||||||
frequency: once
|
win_scheduled_task:
|
||||||
state: present
|
name: TriggerTask
|
||||||
enabled: yes
|
path: \Custom
|
||||||
user: DOMAIN\user
|
actions:
|
||||||
runlevel: highest
|
- path: cmd.exe
|
||||||
store_password: no
|
triggers:
|
||||||
|
- type: daily
|
||||||
|
- type: monthlydow
|
||||||
|
username: SYSTEM
|
||||||
|
|
||||||
|
- name: set logon type to password but don't force update the password
|
||||||
|
win_scheduled_task:
|
||||||
|
name: TriggerTask
|
||||||
|
path: \Custom
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
username: Administrator
|
||||||
|
password: password
|
||||||
|
update_password: no
|
||||||
|
|
||||||
|
- name: disable a task that already exists
|
||||||
|
win_scheduled_task:
|
||||||
|
name: TaskToDisable
|
||||||
|
enabled: no
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = r'''
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
test_scheduled_task_name: Ansible Test
|
||||||
|
test_scheduled_task_path: \Ansible Test Folder
|
||||||
|
test_scheduled_task_user: MooCow
|
||||||
|
test_scheduled_task_pass: Password01
|
|
@ -0,0 +1,278 @@
|
||||||
|
#!powershell
|
||||||
|
#Requires -Module Ansible.ModuleUtils.Legacy
|
||||||
|
#Requires -Module Ansible.ModuleUtils.SID
|
||||||
|
|
||||||
|
$params = Parse-Args -arguments $args
|
||||||
|
$path = Get-AnsibleParam -obj $params -name "path" -type "str" -failifempty $true
|
||||||
|
$name = Get-AnsibleParam -obj $params -name "name" -type "str"
|
||||||
|
|
||||||
|
$result = @{
|
||||||
|
changed = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-Type -TypeDefinition @"
|
||||||
|
public enum TASK_ACTION_TYPE
|
||||||
|
{
|
||||||
|
TASK_ACTION_EXEC = 0,
|
||||||
|
// The below are not supported and are only kept for documentation purposes
|
||||||
|
TASK_ACTION_COM_HANDLER = 5,
|
||||||
|
TASK_ACTION_SEND_EMAIL = 6,
|
||||||
|
TASK_ACTION_SHOW_MESSAGE = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TASK_LOGON_TYPE
|
||||||
|
{
|
||||||
|
TASK_LOGON_NONE = 0,
|
||||||
|
TASK_LOGON_PASSWORD = 1,
|
||||||
|
TASK_LOGON_S4U = 2,
|
||||||
|
TASK_LOGON_INTERACTIVE_TOKEN = 3,
|
||||||
|
TASK_LOGON_GROUP = 4,
|
||||||
|
TASK_LOGON_SERVICE_ACCOUNT = 5,
|
||||||
|
TASK_LOGON_INTERACTIVE_TOKEN_OR_PASSWORD = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TASK_RUN_LEVEL
|
||||||
|
{
|
||||||
|
TASK_RUNLEVEL_LUA = 0,
|
||||||
|
TASK_RUNLEVEL_HIGHEST = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TASK_TRIGGER_TYPE2
|
||||||
|
{
|
||||||
|
TASK_TRIGGER_EVENT = 0,
|
||||||
|
TASK_TRIGGER_TIME = 1,
|
||||||
|
TASK_TRIGGER_DAILY = 2,
|
||||||
|
TASK_TRIGGER_WEEKLY = 3,
|
||||||
|
TASK_TRIGGER_MONTHLY = 4,
|
||||||
|
TASK_TRIGGER_MONTHLYDOW = 5,
|
||||||
|
TASK_TRIGGER_IDLE = 6,
|
||||||
|
TASK_TRIGGER_REGISTRATION = 7,
|
||||||
|
TASK_TRIGGER_BOOT = 8,
|
||||||
|
TASK_TRIGGER_LOGON = 9,
|
||||||
|
TASK_TRIGGER_SESSION_STATE_CHANGE = 11
|
||||||
|
}
|
||||||
|
"@
|
||||||
|
|
||||||
|
Function Get-PropertyValue($task_property, $com, $property) {
|
||||||
|
$raw_value = $com.$property
|
||||||
|
|
||||||
|
if ($raw_value -eq $null) {
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($property) {
|
||||||
|
DaysOfWeek {
|
||||||
|
$value_list = @()
|
||||||
|
$map = @(
|
||||||
|
@{ day = "sunday"; bitwise = 0x01 }
|
||||||
|
@{ day = "monday"; bitwise = 0x02 }
|
||||||
|
@{ day = "tuesday"; bitwise = 0x04 }
|
||||||
|
@{ day = "wednesday"; bitwise = 0x08 }
|
||||||
|
@{ day = "thursday"; bitwise = 0x10 }
|
||||||
|
@{ day = "friday"; bitwise = 0x20 }
|
||||||
|
@{ day = "saturday"; bitwise = 0x40 }
|
||||||
|
)
|
||||||
|
foreach ($entry in $map) {
|
||||||
|
$day = $entry.day
|
||||||
|
$bitwise = $entry.bitwise
|
||||||
|
if ($raw_value -band $bitwise) {
|
||||||
|
$value_list += $day
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $value_list -join ","
|
||||||
|
break
|
||||||
|
}
|
||||||
|
DaysOfMonth {
|
||||||
|
$value_list = @()
|
||||||
|
$map = @(
|
||||||
|
@{ day = "1"; bitwise = 0x01 }
|
||||||
|
@{ day = "2"; bitwise = 0x02 }
|
||||||
|
@{ day = "3"; bitwise = 0x04 }
|
||||||
|
@{ day = "4"; bitwise = 0x08 }
|
||||||
|
@{ day = "5"; bitwise = 0x10 }
|
||||||
|
@{ day = "6"; bitwise = 0x20 }
|
||||||
|
@{ day = "7"; bitwise = 0x40 }
|
||||||
|
@{ day = "8"; bitwise = 0x80 }
|
||||||
|
@{ day = "9"; bitwise = 0x100 }
|
||||||
|
@{ day = "10"; bitwise = 0x200 }
|
||||||
|
@{ day = "11"; bitwise = 0x400 }
|
||||||
|
@{ day = "12"; bitwise = 0x800 }
|
||||||
|
@{ day = "13"; bitwise = 0x1000 }
|
||||||
|
@{ day = "14"; bitwise = 0x2000 }
|
||||||
|
@{ day = "15"; bitwise = 0x4000 }
|
||||||
|
@{ day = "16"; bitwise = 0x8000 }
|
||||||
|
@{ day = "17"; bitwise = 0x10000 }
|
||||||
|
@{ day = "18"; bitwise = 0x20000 }
|
||||||
|
@{ day = "19"; bitwise = 0x40000 }
|
||||||
|
@{ day = "20"; bitwise = 0x80000 }
|
||||||
|
@{ day = "21"; bitwise = 0x100000 }
|
||||||
|
@{ day = "22"; bitwise = 0x200000 }
|
||||||
|
@{ day = "23"; bitwise = 0x400000 }
|
||||||
|
@{ day = "24"; bitwise = 0x800000 }
|
||||||
|
@{ day = "25"; bitwise = 0x1000000 }
|
||||||
|
@{ day = "26"; bitwise = 0x2000000 }
|
||||||
|
@{ day = "27"; bitwise = 0x4000000 }
|
||||||
|
@{ day = "28"; bitwise = 0x8000000 }
|
||||||
|
@{ day = "29"; bitwise = 0x10000000 }
|
||||||
|
@{ day = "30"; bitwise = 0x20000000 }
|
||||||
|
@{ day = "31"; bitwise = 0x40000000 }
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($entry in $map) {
|
||||||
|
$day = $entry.day
|
||||||
|
$bitwise = $entry.bitwise
|
||||||
|
if ($raw_value -band $bitwise) {
|
||||||
|
$value_list += $day
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $value_list -join ","
|
||||||
|
break
|
||||||
|
}
|
||||||
|
WeeksOfMonth {
|
||||||
|
$value_list = @()
|
||||||
|
$map = @(
|
||||||
|
@{ week = "1"; bitwise = 0x01 }
|
||||||
|
@{ week = "2"; bitwise = 0x02 }
|
||||||
|
@{ week = "3"; bitwise = 0x04 }
|
||||||
|
@{ week = "4"; bitwise = 0x04 }
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($entry in $map) {
|
||||||
|
$week = $entry.week
|
||||||
|
$bitwise = $entry.bitwise
|
||||||
|
if ($raw_value -band $bitwise) {
|
||||||
|
$value_list += $week
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $value_list -join ","
|
||||||
|
break
|
||||||
|
}
|
||||||
|
MonthsOfYear {
|
||||||
|
$value_list = @()
|
||||||
|
$map = @(
|
||||||
|
@{ month = "january"; bitwise = 0x01 }
|
||||||
|
@{ month = "february"; bitwise = 0x02 }
|
||||||
|
@{ month = "march"; bitwise = 0x04 }
|
||||||
|
@{ month = "april"; bitwise = 0x08 }
|
||||||
|
@{ month = "may"; bitwise = 0x10 }
|
||||||
|
@{ month = "june"; bitwise = 0x20 }
|
||||||
|
@{ month = "july"; bitwise = 0x40 }
|
||||||
|
@{ month = "august"; bitwise = 0x80 }
|
||||||
|
@{ month = "september"; bitwise = 0x100 }
|
||||||
|
@{ month = "october"; bitwise = 0x200 }
|
||||||
|
@{ month = "november"; bitwise = 0x400 }
|
||||||
|
@{ month = "december"; bitwise = 0x800 }
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($entry in $map) {
|
||||||
|
$month = $entry.month
|
||||||
|
$bitwise = $entry.bitwise
|
||||||
|
if ($raw_value -band $bitwise) {
|
||||||
|
$value_list += $month
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $value_list -join ","
|
||||||
|
break
|
||||||
|
}
|
||||||
|
Type {
|
||||||
|
if ($task_property -eq "actions") {
|
||||||
|
$value = [Enum]::ToObject([TASK_ACTION_TYPE], $raw_value).ToString()
|
||||||
|
} elseif ($task_property -eq "triggers") {
|
||||||
|
$value = [Enum]::ToObject([TASK_TRIGGER_TYPE2], $raw_value).ToString()
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
RunLevel {
|
||||||
|
$value = [Enum]::ToObject([TASK_RUN_LEVEL], $raw_value).ToString()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
LogonType {
|
||||||
|
$value = [Enum]::ToObject([TASK_LOGON_TYPE], $raw_value).ToString()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
UserId {
|
||||||
|
$sid = Convert-ToSID -account_name $raw_value
|
||||||
|
$value = Convert-FromSid -sid $sid
|
||||||
|
}
|
||||||
|
GroupId {
|
||||||
|
$sid = Convert-ToSID -account_name $raw_value
|
||||||
|
$value = Convert-FromSid -sid $sid
|
||||||
|
}
|
||||||
|
default {
|
||||||
|
$value = $raw_value
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ,$value
|
||||||
|
}
|
||||||
|
|
||||||
|
$service = New-Object -ComObject Schedule.Service
|
||||||
|
$service.Connect()
|
||||||
|
|
||||||
|
try {
|
||||||
|
$task_folder = $service.GetFolder($path)
|
||||||
|
$result.folder_exists = $true
|
||||||
|
} catch {
|
||||||
|
$result.folder_exists = $false
|
||||||
|
$task_folder = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
$folder_tasks = $task_folder.GetTasks(1)
|
||||||
|
$folder_task_names = @()
|
||||||
|
$folder_task_count = 0
|
||||||
|
$task = $null
|
||||||
|
for ($i = 1; $i -le $folder_tasks.Count; $i++) {
|
||||||
|
$task_name = $folder_tasks.Item($i).Name
|
||||||
|
$folder_task_names += $task_name
|
||||||
|
$folder_task_count += 1
|
||||||
|
|
||||||
|
if ($name -ne $null -and $task_name -eq $name) {
|
||||||
|
$task = $folder_tasks.Item($i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$result.folder_task_names = $folder_task_names
|
||||||
|
$result.folder_task_count = $folder_task_count
|
||||||
|
|
||||||
|
if ($name -ne $null) {
|
||||||
|
if ($task -ne $null) {
|
||||||
|
$task_definition = $task.Definition
|
||||||
|
$result.task_exists = $true
|
||||||
|
$result.task = @{}
|
||||||
|
|
||||||
|
$properties = @("principal", "registration_info", "settings")
|
||||||
|
$collection_properties = @("actions", "triggers")
|
||||||
|
|
||||||
|
foreach ($property in $properties) {
|
||||||
|
$property_name = $property -replace "_"
|
||||||
|
$result.task.$property = @{}
|
||||||
|
$values = $task_definition.$property_name
|
||||||
|
Get-Member -InputObject $values -MemberType Property | % {
|
||||||
|
$result.task.$property.$($_.Name) = (Get-PropertyValue -task_property $property -com $values -property $_.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($property in $collection_properties) {
|
||||||
|
$result.task.$property = @()
|
||||||
|
$collection = $task_definition.$property
|
||||||
|
$collection_count = $collection.Count
|
||||||
|
for ($i = 1; $i -le $collection_count; $i++) {
|
||||||
|
$item = $collection.Item($i)
|
||||||
|
$item_info = @{}
|
||||||
|
|
||||||
|
Get-Member -InputObject $item -MemberType Property | % {
|
||||||
|
$item_info.$($_.Name) = (Get-PropertyValue -task_property $property -com $item -property $_.Name)
|
||||||
|
}
|
||||||
|
$result.task.$property += $item_info
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$result.task_exists = $false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Exit-Json -obj $result
|
16
test/integration/targets/win_scheduled_task/tasks/clean.yml
Normal file
16
test/integration/targets/win_scheduled_task/tasks/clean.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# cleans up each test to ensure a blank slate
|
||||||
|
---
|
||||||
|
- win_scheduled_task:
|
||||||
|
name: '{{item.name}}'
|
||||||
|
path: '{{item.path|default(omit)}}'
|
||||||
|
state: absent
|
||||||
|
with_items:
|
||||||
|
- name: Task # old tests
|
||||||
|
path: \Path
|
||||||
|
- name: '{{test_scheduled_task_name}}'
|
||||||
|
- name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
|
||||||
|
- win_user:
|
||||||
|
name: '{{test_scheduled_task_user}}'
|
||||||
|
state: absent
|
123
test/integration/targets/win_scheduled_task/tasks/failures.yml
Normal file
123
test/integration/targets/win_scheduled_task/tasks/failures.yml
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
# test out the known failure cases to ensure we have decent error messages
|
||||||
|
---
|
||||||
|
- name: fail create task without an action
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
register: fail_create_without_action
|
||||||
|
failed_when: fail_create_without_action.msg != 'cannot create a task with no actions, set at least one action with a path to an executable'
|
||||||
|
|
||||||
|
- name: fail both username and group are set
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{ansible_user}}'
|
||||||
|
group: '{{ansible_user}}'
|
||||||
|
register: fail_username_and_group
|
||||||
|
failed_when: fail_username_and_group.msg != 'username and group can not be set at the same time'
|
||||||
|
|
||||||
|
- name: fail logon type password but no password set
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
logon_type: password
|
||||||
|
register: fail_lt_password_not_set
|
||||||
|
failed_when: fail_lt_password_not_set.msg != 'password must be set when logon_type=password'
|
||||||
|
|
||||||
|
- name: fail logon type s4u but no password set
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
logon_type: s4u
|
||||||
|
register: fail_lt_s4u_not_set
|
||||||
|
failed_when: fail_lt_s4u_not_set.msg != 'password must be set when logon_type=s4u'
|
||||||
|
|
||||||
|
- name: fail logon type group but no group set
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
logon_type: group
|
||||||
|
register: fail_lt_group_not_set
|
||||||
|
failed_when: fail_lt_group_not_set.msg != 'group must be set when logon_type=group'
|
||||||
|
|
||||||
|
- name: fail logon type service but non service user set
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
logon_type: service_account
|
||||||
|
username: '{{ansible_user}}'
|
||||||
|
register: fail_lt_service_invalid_user
|
||||||
|
failed_when: fail_lt_service_invalid_user.msg != 'username must be SYSTEM, LOCAL SERVICE or NETWORK SERVICE when logon_type=service_account'
|
||||||
|
|
||||||
|
- name: fail trigger with no type
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- delay: test
|
||||||
|
register: fail_trigger_no_type
|
||||||
|
failed_when: fail_trigger_no_type.msg != "a trigger entry must contain a key 'type' with a value of 'event', 'time', 'daily', 'weekly', 'monthly', 'monthlydow', 'idle', 'registration', 'boot', 'logon', 'session_state_change'"
|
||||||
|
|
||||||
|
- name: fail trigger with datetime in incorrect format
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: time
|
||||||
|
start_boundary: fake
|
||||||
|
register: fail_trigger_invalid_datetime
|
||||||
|
failed_when: fail_trigger_invalid_datetime.msg != "trigger option 'start_boundary' must be in the format 'YYYY-MM-DDThh:mm:ss' format but was 'fake'"
|
||||||
|
|
||||||
|
- name: fail trigger with duration in incorrect format
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: boot
|
||||||
|
execution_time_limit: fake
|
||||||
|
register: fail_trigger_invalid_duration
|
||||||
|
failed_when: fail_trigger_invalid_duration.msg != "trigger option 'execution_time_limit' must be in the XML duration format but was 'fake'"
|
||||||
|
|
||||||
|
- name: fail trigger option invalid day of the week
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: weekly
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
days_of_week: fakeday
|
||||||
|
register: fail_trigger_invalid_day_of_week
|
||||||
|
failed_when: fail_trigger_invalid_day_of_week.msg != "invalid day of week 'fakeday', check the spelling matches the full day name"
|
||||||
|
|
||||||
|
- name: fail trigger option invalid day of the month
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: monthly
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
days_of_month: 35
|
||||||
|
register: fail_trigger_invalid_day_of_month
|
||||||
|
failed_when: fail_trigger_invalid_day_of_month.msg != "invalid day of month '35', please specify numbers from 1-31"
|
||||||
|
|
||||||
|
- name: fail trigger option invalid week of the month
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: monthlydow
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
weeks_of_month: 5
|
||||||
|
register: fail_trigger_invalid_week_of_month
|
||||||
|
failed_when: fail_trigger_invalid_week_of_month.msg != "invalid week of month '5', please specify weeks from 1-4"
|
||||||
|
|
||||||
|
- name: fail trigger option invalid month of the year
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
triggers:
|
||||||
|
- type: monthlydow
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
months_of_year: fakemonth
|
||||||
|
register: fail_trigger_invalid_month_of_year
|
||||||
|
failed_when: fail_trigger_invalid_month_of_year.msg != "invalid month name 'fakemonth', please specify full month name"
|
|
@ -1,21 +1,38 @@
|
||||||
# NOTE: The win_scheduled_task module only works on Win2012+
|
---
|
||||||
|
- name: remove test tasks before test
|
||||||
- name: Test Windows capabilities
|
include_tasks: clean.yml
|
||||||
raw: Get-Command New-ScheduledTask -ErrorAction SilentlyContinue; return $?
|
|
||||||
failed_when: no
|
|
||||||
register: new_scheduledtask
|
|
||||||
|
|
||||||
- name: Only run tests when Windows is capable
|
|
||||||
when: new_scheduledtask.rc == 0
|
|
||||||
block:
|
|
||||||
|
|
||||||
|
- block:
|
||||||
|
# old tests, remove once new code is considered stable
|
||||||
- name: Test in normal mode
|
- name: Test in normal mode
|
||||||
include: tests.yml
|
include_tasks: tests.yml
|
||||||
vars:
|
vars:
|
||||||
in_check_mode: no
|
in_check_mode: no
|
||||||
|
|
||||||
- name: Test in check-mode
|
- name: Test in check-mode
|
||||||
include: tests.yml
|
include_tasks: tests.yml
|
||||||
vars:
|
vars:
|
||||||
in_check_mode: yes
|
in_check_mode: yes
|
||||||
check_mode: yes
|
check_mode: yes
|
||||||
|
|
||||||
|
- include_tasks: clean.yml
|
||||||
|
|
||||||
|
- name: Test failure scenarios
|
||||||
|
include: failures.yml
|
||||||
|
|
||||||
|
- name: Test normal scenarios
|
||||||
|
include_tasks: new_tests.yml
|
||||||
|
|
||||||
|
- include_tasks: clean.yml
|
||||||
|
|
||||||
|
- name: Test principals
|
||||||
|
include_tasks: principals.yml
|
||||||
|
|
||||||
|
- include_tasks: clean.yml
|
||||||
|
|
||||||
|
- name: Test triggers
|
||||||
|
include_tasks: triggers.yml
|
||||||
|
|
||||||
|
always:
|
||||||
|
- name: remove test tasks after test
|
||||||
|
include_tasks: clean.yml
|
||||||
|
|
440
test/integration/targets/win_scheduled_task/tasks/new_tests.yml
Normal file
440
test/integration/targets/win_scheduled_task/tasks/new_tests.yml
Normal file
|
@ -0,0 +1,440 @@
|
||||||
|
---
|
||||||
|
- name: create task (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
description: Original Description
|
||||||
|
register: create_task_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create task (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_task_result_check
|
||||||
|
|
||||||
|
- name: assert results of create task (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_task_check|changed
|
||||||
|
- create_task_result_check.task_exists == False
|
||||||
|
|
||||||
|
- name: create task
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
description: Original Description
|
||||||
|
register: create_task
|
||||||
|
|
||||||
|
- name: get result of create task
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_task_result
|
||||||
|
|
||||||
|
- name: assert results of create task
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_task|changed
|
||||||
|
- create_task_result.task_exists == True
|
||||||
|
- create_task_result.task.actions|count == 1
|
||||||
|
- create_task_result.task.actions[0].Path == "cmd.exe"
|
||||||
|
- create_task_result.task.actions[0].Arguments == "/c echo hi"
|
||||||
|
- create_task_result.task.actions[0].WorkingDirectory == None
|
||||||
|
- create_task_result.task.registration_info.Description == "Original Description"
|
||||||
|
- create_task_result.task.triggers|count == 0
|
||||||
|
|
||||||
|
- name: create task (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
description: Original Description
|
||||||
|
register: create_task_again
|
||||||
|
|
||||||
|
- name: assert results of create task (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not create_task_again|changed
|
||||||
|
|
||||||
|
- name: change task (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
author: Cow Inc.
|
||||||
|
description: Test for Ansible
|
||||||
|
allow_demand_start: no
|
||||||
|
restart_count: 5
|
||||||
|
restart_interval: PT2H5M
|
||||||
|
register: change_task_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of change task (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: change_task_result_check
|
||||||
|
|
||||||
|
- name: assert results of change task (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- change_task_check|changed
|
||||||
|
- change_task_result_check.task.actions|count == 1
|
||||||
|
- change_task_result_check.task.registration_info.Author == None
|
||||||
|
- change_task_result_check.task.registration_info.Description == "Original Description"
|
||||||
|
- change_task_result_check.task.settings.AllowDemandStart == true
|
||||||
|
- change_task_result_check.task.settings.RestartCount == 0
|
||||||
|
- change_task_result_check.task.settings.RestartInterval == None
|
||||||
|
|
||||||
|
- name: change task
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
author: Cow Inc.
|
||||||
|
description: Test for Ansible
|
||||||
|
allow_demand_start: no
|
||||||
|
restart_count: 5
|
||||||
|
restart_interval: PT1M
|
||||||
|
register: change_task
|
||||||
|
|
||||||
|
- name: get result of change task
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: change_task_result
|
||||||
|
|
||||||
|
- name: assert results of change task
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- change_task|changed
|
||||||
|
- change_task_result.task.actions|count == 1
|
||||||
|
- change_task_result.task.registration_info.Author == "Cow Inc."
|
||||||
|
- change_task_result.task.registration_info.Description == "Test for Ansible"
|
||||||
|
- change_task_result.task.settings.AllowDemandStart == false
|
||||||
|
- change_task_result.task.settings.RestartCount == 5
|
||||||
|
- change_task_result.task.settings.RestartInterval == "PT1M"
|
||||||
|
|
||||||
|
- name: change task (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
author: Cow Inc.
|
||||||
|
description: Test for Ansible
|
||||||
|
allow_demand_start: no
|
||||||
|
restart_count: 5
|
||||||
|
restart_interval: PT1M
|
||||||
|
register: change_task_again
|
||||||
|
|
||||||
|
- name: assert results of change task (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not change_task_again|changed
|
||||||
|
|
||||||
|
- name: add task action (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: add_task_action_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of add task action (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: add_task_action_result_check
|
||||||
|
|
||||||
|
- name: assert results of add task action (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- add_task_action_check|changed
|
||||||
|
- add_task_action_result_check.task.actions|count == 1
|
||||||
|
- add_task_action_result_check.task.actions[0].Path == "cmd.exe"
|
||||||
|
- add_task_action_result_check.task.actions[0].Arguments == "/c echo hi"
|
||||||
|
- add_task_action_result_check.task.actions[0].WorkingDirectory == None
|
||||||
|
|
||||||
|
- name: add task action
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: add_task_action
|
||||||
|
|
||||||
|
- name: get result of add task action
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: add_task_action_result
|
||||||
|
|
||||||
|
- name: assert results of add task action
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- add_task_action|changed
|
||||||
|
- add_task_action_result.task.actions|count == 2
|
||||||
|
- add_task_action_result.task.actions[0].Path == "cmd.exe"
|
||||||
|
- add_task_action_result.task.actions[0].Arguments == "/c echo hi"
|
||||||
|
- add_task_action_result.task.actions[0].WorkingDirectory == None
|
||||||
|
- add_task_action_result.task.actions[1].Path == "powershell.exe"
|
||||||
|
- add_task_action_result.task.actions[1].Arguments == "-File C:\\ansible\\script.ps1"
|
||||||
|
- add_task_action_result.task.actions[1].WorkingDirectory == "C:\\ansible"
|
||||||
|
|
||||||
|
- name: add task action (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
arguments: /c echo hi
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: add_task_action_again
|
||||||
|
|
||||||
|
- name: assert results of add task action (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not add_task_action_again|changed
|
||||||
|
|
||||||
|
- name: remove task action (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: remove_task_action_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of remove task action (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_task_action_result_check
|
||||||
|
|
||||||
|
- name: assert results of remove task action (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_task_action_check|changed
|
||||||
|
- remove_task_action_result_check.task.actions|count == 2
|
||||||
|
- remove_task_action_result_check.task.actions[0].Path == "cmd.exe"
|
||||||
|
- remove_task_action_result_check.task.actions[0].Arguments == "/c echo hi"
|
||||||
|
- remove_task_action_result_check.task.actions[0].WorkingDirectory == None
|
||||||
|
- remove_task_action_result_check.task.actions[1].Path == "powershell.exe"
|
||||||
|
- remove_task_action_result_check.task.actions[1].Arguments == "-File C:\\ansible\\script.ps1"
|
||||||
|
- remove_task_action_result_check.task.actions[1].WorkingDirectory == "C:\\ansible"
|
||||||
|
|
||||||
|
- name: remove task action
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: remove_task_action
|
||||||
|
|
||||||
|
- name: get result of remove task action
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_task_action_result
|
||||||
|
|
||||||
|
- name: assert results of remove task action
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_task_action|changed
|
||||||
|
- remove_task_action_result.task.actions|count == 1
|
||||||
|
- remove_task_action_result.task.actions[0].Path == "powershell.exe"
|
||||||
|
- remove_task_action_result.task.actions[0].Arguments == "-File C:\\ansible\\script.ps1"
|
||||||
|
- remove_task_action_result.task.actions[0].WorkingDirectory == "C:\\ansible"
|
||||||
|
|
||||||
|
- name: remove task action (idempontent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: powershell.exe
|
||||||
|
arguments: -File C:\ansible\script.ps1
|
||||||
|
working_directory: C:\ansible
|
||||||
|
register: remove_task_action_again
|
||||||
|
|
||||||
|
- name: assert results of remove task action (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not remove_task_action_again|changed
|
||||||
|
|
||||||
|
- name: remove task (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_task_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of remove task (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_task_result_check
|
||||||
|
|
||||||
|
- name: assert results of remove task (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_task_check|changed
|
||||||
|
- remove_task_result_check.task_exists == True
|
||||||
|
|
||||||
|
- name: remove task
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_task
|
||||||
|
|
||||||
|
- name: get result of remove task
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_task_result
|
||||||
|
|
||||||
|
- name: assert results of remove task
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_task|changed
|
||||||
|
- remove_task_result.task_exists == False
|
||||||
|
|
||||||
|
- name: remove task (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_task_again
|
||||||
|
|
||||||
|
- name: assert results of remove task (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not remove_task_again|changed
|
||||||
|
|
||||||
|
- name: create sole task in folder (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: create_sole_task_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create sole task in folder (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_sole_task_result_check
|
||||||
|
|
||||||
|
- name: assert results of create sole task in folder (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_sole_task_check|changed
|
||||||
|
- create_sole_task_result_check.folder_exists == False
|
||||||
|
- create_sole_task_result_check.task_exists == False
|
||||||
|
|
||||||
|
- name: create sole task in folder
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: create_sole_task
|
||||||
|
|
||||||
|
- name: get result of create sole task in folder
|
||||||
|
test_task_stat:
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_sole_task_result
|
||||||
|
|
||||||
|
- name: assert results of create sole task in folder
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_sole_task|changed
|
||||||
|
- create_sole_task_result.folder_exists == True
|
||||||
|
- create_sole_task_result.task_exists == True
|
||||||
|
|
||||||
|
- name: create sole task in folder (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: create_sole_task_again
|
||||||
|
|
||||||
|
- name: assert results of create sole task in folder (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not create_sole_task_again|changed
|
||||||
|
|
||||||
|
- name: remove sole task in folder (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_sole_task_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of remove sole task in folder (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_sole_task_result_check
|
||||||
|
|
||||||
|
- name: assert results of remove sole task in folder (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_sole_task_check|changed
|
||||||
|
- remove_sole_task_result_check.folder_exists == True
|
||||||
|
- remove_sole_task_result_check.task_exists == True
|
||||||
|
|
||||||
|
- name: remove sole task in folder
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_sole_task
|
||||||
|
|
||||||
|
- name: get result of remove sole task in folder
|
||||||
|
test_task_stat:
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_sole_task_result
|
||||||
|
|
||||||
|
- name: assert results of remove sole task in folder
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_sole_task|changed
|
||||||
|
- remove_sole_task_result.folder_exists == False
|
||||||
|
- remove_sole_task_result.task_exists == False
|
||||||
|
|
||||||
|
- name: remove sole task in folder (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
path: '{{test_scheduled_task_path}}'
|
||||||
|
state: absent
|
||||||
|
register: remove_sole_task_again
|
||||||
|
|
||||||
|
- name: assert results of remove sole task in folder (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not remove_sole_task_again|changed
|
436
test/integration/targets/win_scheduled_task/tasks/principals.yml
Normal file
436
test/integration/targets/win_scheduled_task/tasks/principals.yml
Normal file
|
@ -0,0 +1,436 @@
|
||||||
|
---
|
||||||
|
- name: create test user
|
||||||
|
win_user:
|
||||||
|
name: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
state: present
|
||||||
|
groups:
|
||||||
|
- Administrators
|
||||||
|
|
||||||
|
- name: task with password principal (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: password
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_password_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with password principal (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_password_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with password principal (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_password_check|changed
|
||||||
|
- task_with_password_result_check.task_exists == False
|
||||||
|
|
||||||
|
- name: task with password principal
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: password
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_password
|
||||||
|
|
||||||
|
- name: get result of task with password principal
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_password_result
|
||||||
|
|
||||||
|
- name: assert results of task with password principal
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_password|changed
|
||||||
|
- task_with_password_result.task_exists == True
|
||||||
|
- task_with_password_result.task.principal.GroupId == None
|
||||||
|
- task_with_password_result.task.principal.LogonType == "TASK_LOGON_PASSWORD"
|
||||||
|
- task_with_password_result.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_password_result.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with password principal (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: password
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_password_again
|
||||||
|
|
||||||
|
- name: assert results of task with password principal (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_password_again|changed
|
||||||
|
|
||||||
|
- name: task with password principal force pass change
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: password
|
||||||
|
update_password: yes
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_password_force_update
|
||||||
|
|
||||||
|
- name: assert results of task with password principal force pass change
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_password_force_update|changed
|
||||||
|
|
||||||
|
- name: task with s4u principal (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: s4u
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_s4u_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with s4u principal (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_s4u_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with s4u principal (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_s4u_check|changed
|
||||||
|
- task_with_s4u_result_check.task_exists == True
|
||||||
|
- task_with_s4u_result_check.task.principal.GroupId == None
|
||||||
|
- task_with_s4u_result_check.task.principal.LogonType == "TASK_LOGON_PASSWORD"
|
||||||
|
- task_with_s4u_result_check.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_s4u_result_check.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with s4u principal
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: s4u
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_s4u
|
||||||
|
|
||||||
|
- name: get result of task with s4u principal
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_s4u_result
|
||||||
|
|
||||||
|
- name: assert results of task with s4u principal
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_s4u|changed
|
||||||
|
- task_with_s4u_result.task_exists == True
|
||||||
|
- task_with_s4u_result.task.principal.GroupId == None
|
||||||
|
- task_with_s4u_result.task.principal.LogonType == "TASK_LOGON_S4U"
|
||||||
|
- task_with_s4u_result.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_s4u_result.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with s4u principal (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
password: '{{test_scheduled_task_pass}}'
|
||||||
|
logon_type: s4u
|
||||||
|
update_password: no
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_s4u_again
|
||||||
|
|
||||||
|
- name: assert results of task with s4u principal (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_s4u_again|changed
|
||||||
|
|
||||||
|
- name: task with interactive principal (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
logon_type: interactive_token
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_interactive_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with interactive principal (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_interactive_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with interactive principal (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_interactive_check|changed
|
||||||
|
- task_with_interactive_result_check.task_exists == True
|
||||||
|
- task_with_interactive_result_check.task.principal.GroupId == None
|
||||||
|
- task_with_interactive_result_check.task.principal.LogonType == "TASK_LOGON_S4U"
|
||||||
|
- task_with_interactive_result_check.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_interactive_result_check.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with interactive principal
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
logon_type: interactive_token
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_interactive
|
||||||
|
|
||||||
|
- name: get result of task with interactive principal
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_interactive_result
|
||||||
|
|
||||||
|
- name: assert results of task with interactive principal
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_interactive|changed
|
||||||
|
- task_with_interactive_result.task_exists == True
|
||||||
|
- task_with_interactive_result.task.principal.GroupId == None
|
||||||
|
- task_with_interactive_result.task.principal.LogonType == "TASK_LOGON_INTERACTIVE_TOKEN"
|
||||||
|
- task_with_interactive_result.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_interactive_result.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with interactive principal (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: '{{test_scheduled_task_user}}'
|
||||||
|
logon_type: interactive_token
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_interactive_again
|
||||||
|
|
||||||
|
- name: assert results of task with interactive principal (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_interactive_again|changed
|
||||||
|
|
||||||
|
- name: task with group principal (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
group: Administrators
|
||||||
|
logon_type: group
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_group_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with group principal (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_group_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with group principal (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_group_check|changed
|
||||||
|
- task_with_group_result_check.task_exists == True
|
||||||
|
- task_with_group_result_check.task.principal.GroupId == None
|
||||||
|
- task_with_group_result_check.task.principal.LogonType == "TASK_LOGON_INTERACTIVE_TOKEN"
|
||||||
|
- task_with_group_result_check.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_group_result_check.task.principal.UserId.endswith(test_scheduled_task_user)
|
||||||
|
|
||||||
|
- name: task with group principal
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
group: Administrators
|
||||||
|
logon_type: group
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_group
|
||||||
|
|
||||||
|
- name: get result of task with group principal
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_group_result
|
||||||
|
|
||||||
|
- name: assert results of task with group principal
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_group|changed
|
||||||
|
- task_with_group_result.task_exists == True
|
||||||
|
- task_with_group_result.task.principal.GroupId == "BUILTIN\\Administrators"
|
||||||
|
- task_with_group_result.task.principal.LogonType == "TASK_LOGON_GROUP"
|
||||||
|
- task_with_group_result.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_group_result.task.principal.UserId == None
|
||||||
|
|
||||||
|
- name: task with group principal (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
group: Administrators
|
||||||
|
logon_type: group
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_group_again
|
||||||
|
|
||||||
|
- name: assert results of task with group principal (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_group_again|changed
|
||||||
|
|
||||||
|
- name: task with service account principal (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_service_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with service account principal (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_service_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with service account principal (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_service_check|changed
|
||||||
|
- task_with_service_result_check.task_exists == True
|
||||||
|
- task_with_service_result_check.task.principal.GroupId == "BUILTIN\\Administrators"
|
||||||
|
- task_with_service_result_check.task.principal.LogonType == "TASK_LOGON_GROUP"
|
||||||
|
- task_with_service_result_check.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_service_result_check.task.principal.UserId == None
|
||||||
|
|
||||||
|
- name: task with service account principal
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_service
|
||||||
|
|
||||||
|
- name: get result of task with service account principal
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_service_result
|
||||||
|
|
||||||
|
- name: assert results of task with service account principal
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_service|changed
|
||||||
|
- task_with_service_result.task_exists == True
|
||||||
|
- task_with_service_result.task.principal.GroupId == None
|
||||||
|
- task_with_service_result.task.principal.LogonType == "TASK_LOGON_SERVICE_ACCOUNT"
|
||||||
|
- task_with_service_result.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
- task_with_service_result.task.principal.UserId == "NT AUTHORITY\\SYSTEM"
|
||||||
|
|
||||||
|
- name: task with service account principal (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_service_again
|
||||||
|
|
||||||
|
- name: assert results of task with service account principal (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_service_again|changed
|
||||||
|
|
||||||
|
- name: task with highest privilege (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
run_level: highest
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_highest_privilege_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of task with highest privilege (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_highest_privilege_result_check
|
||||||
|
|
||||||
|
- name: assert results of task with highest privilege (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_highest_privilege_check|changed
|
||||||
|
- task_with_highest_privilege_result_check.task.principal.RunLevel == "TASK_RUNLEVEL_LUA"
|
||||||
|
|
||||||
|
- name: task with highest privilege
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
run_level: highest
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_highest_privilege
|
||||||
|
|
||||||
|
- name: get result of task with highest privilege
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: task_with_highest_privilege_result
|
||||||
|
|
||||||
|
- name: assert results of task with highest privilege
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- task_with_highest_privilege|changed
|
||||||
|
- task_with_highest_privilege_result.task.principal.RunLevel == "TASK_RUNLEVEL_HIGHEST"
|
||||||
|
|
||||||
|
- name: task with highest privilege (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
run_level: highest
|
||||||
|
username: System
|
||||||
|
logon_type: service_account
|
||||||
|
action:
|
||||||
|
- path: cmd.exe
|
||||||
|
register: task_with_highest_privilege_again
|
||||||
|
|
||||||
|
- name: assert results of task with highest privilege (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not task_with_highest_privilege_again|changed
|
|
@ -1,3 +1,6 @@
|
||||||
|
# these are the older tests that test out the deprecated args, keep here until
|
||||||
|
# the new changes are more bedded down
|
||||||
|
---
|
||||||
- name: Remove potentially leftover scheduled task
|
- name: Remove potentially leftover scheduled task
|
||||||
win_scheduled_task: &wst_absent
|
win_scheduled_task: &wst_absent
|
||||||
name: Ansible Test
|
name: Ansible Test
|
||||||
|
@ -18,7 +21,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task.changed == true
|
- add_scheduled_task.changed == true
|
||||||
- add_scheduled_task.exists == false
|
|
||||||
|
|
||||||
|
|
||||||
- name: Add scheduled task (again)
|
- name: Add scheduled task (again)
|
||||||
|
@ -29,14 +31,12 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_again.changed == false
|
- add_scheduled_task_again.changed == false
|
||||||
- add_scheduled_task_again.exists == true
|
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test add_scheduled_task_again (check-mode)
|
- name: Test add_scheduled_task_again (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_again.changed == true
|
- add_scheduled_task_again.changed == true
|
||||||
- add_scheduled_task_again.exists == false
|
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,7 +56,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- disable_scheduled_task.changed == true
|
- disable_scheduled_task.changed == true
|
||||||
- disable_scheduled_task.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Disable scheduled task (again)
|
- name: Disable scheduled task (again)
|
||||||
|
@ -69,7 +68,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- disable_scheduled_task_again.changed == false
|
- disable_scheduled_task_again.changed == false
|
||||||
- disable_scheduled_task_again.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Enable scheduled task
|
- name: Enable scheduled task
|
||||||
|
@ -81,7 +79,6 @@
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- enable_scheduled_task.changed == true
|
- enable_scheduled_task.changed == true
|
||||||
- enable_scheduled_task.exists == true
|
|
||||||
|
|
||||||
- name: Enable scheduled task (again)
|
- name: Enable scheduled task (again)
|
||||||
win_scheduled_task:
|
win_scheduled_task:
|
||||||
|
@ -92,7 +89,6 @@
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- enable_scheduled_task_again.changed == false
|
- enable_scheduled_task_again.changed == false
|
||||||
- enable_scheduled_task_again.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Remove scheduled task
|
- name: Remove scheduled task
|
||||||
|
@ -103,14 +99,12 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task.changed == true
|
- remove_scheduled_task.changed == true
|
||||||
- remove_scheduled_task.exists == true
|
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test remove_scheduled_task (check-mode)
|
- name: Test remove_scheduled_task (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task.changed == false
|
- remove_scheduled_task.changed == false
|
||||||
- remove_scheduled_task.exists == false
|
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,7 +116,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_again.changed == false
|
- remove_scheduled_task_again.changed == false
|
||||||
- remove_scheduled_task_again.exists == false
|
|
||||||
|
|
||||||
|
|
||||||
# Test scheduled task path creation and removal
|
# Test scheduled task path creation and removal
|
||||||
|
@ -157,7 +150,7 @@
|
||||||
- name: Test add_scheduled_task_new_path_1
|
- name: Test add_scheduled_task_new_path_1
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_new_path_1.msg == 'Added new task Ansible Test New Path 1 and task path \\non_existent_path\\ created'
|
- add_scheduled_task_new_path_1|changed
|
||||||
|
|
||||||
|
|
||||||
- name: Add scheduled task new path 2
|
- name: Add scheduled task new path 2
|
||||||
|
@ -169,13 +162,13 @@
|
||||||
- name: Test add_scheduled_task_new_path_2 (normal mode)
|
- name: Test add_scheduled_task_new_path_2 (normal mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_new_path_2.msg == 'Added new task Ansible Test New Path 2'
|
- add_scheduled_task_new_path_2|changed
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test add_scheduled_task_new_path_2 (check-mode)
|
- name: Test add_scheduled_task_new_path_2 (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_new_path_2.msg == 'Added new task Ansible Test New Path 2 and task path \\non_existent_path\\ created'
|
- add_scheduled_task_new_path_2|changed
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,13 +179,13 @@
|
||||||
- name: Test remove_scheduled_task_new_path_2 (normal mode)
|
- name: Test remove_scheduled_task_new_path_2 (normal mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_new_path_2.msg == 'Deleted task Ansible Test New Path 2'
|
- remove_scheduled_task_new_path_2|changed
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test remove_scheduled_task_new_path_2 (check-mode)
|
- name: Test remove_scheduled_task_new_path_2 (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_new_path_2.msg == 'Task does not exist'
|
- not remove_scheduled_task_new_path_2|changed
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
||||||
|
|
||||||
|
@ -203,13 +196,13 @@
|
||||||
- name: Test remove_scheduled_task_new_path_1 (normal mode)
|
- name: Test remove_scheduled_task_new_path_1 (normal mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_new_path_1.msg == 'Deleted task Ansible Test New Path 1 and task path \\non_existent_path\\ removed'
|
- remove_scheduled_task_new_path_1|changed
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test remove_scheduled_task_new_path_1 (check-mode)
|
- name: Test remove_scheduled_task_new_path_1 (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_new_path_1.msg == 'Task does not exist'
|
- not remove_scheduled_task_new_path_1|changed
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,7 +231,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- add_scheduled_task_run_options_1.changed == true
|
- add_scheduled_task_run_options_1.changed == true
|
||||||
- add_scheduled_task_run_options_1.exists == false
|
|
||||||
|
|
||||||
|
|
||||||
- name: Execute run options tests for normal mode only (expects scheduled task)
|
- name: Execute run options tests for normal mode only (expects scheduled task)
|
||||||
|
@ -255,7 +247,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- change_scheduled_task_run_options_user.changed == true
|
- change_scheduled_task_run_options_user.changed == true
|
||||||
- change_scheduled_task_run_options_user.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Change scheduled task run options user (again)
|
- name: Change scheduled task run options user (again)
|
||||||
|
@ -268,7 +259,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- change_scheduled_task_run_options_user_again.changed == false
|
- change_scheduled_task_run_options_user_again.changed == false
|
||||||
- change_scheduled_task_run_options_user_again.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Change scheduled task run options run level
|
- name: Change scheduled task run options run level
|
||||||
|
@ -282,7 +272,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- change_scheduled_task_run_options_runlevel.changed == true
|
- change_scheduled_task_run_options_runlevel.changed == true
|
||||||
- change_scheduled_task_run_options_runlevel.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Change scheduled task run options run level (again)
|
- name: Change scheduled task run options run level (again)
|
||||||
|
@ -296,7 +285,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- change_scheduled_task_run_options_runlevel_again.changed == false
|
- change_scheduled_task_run_options_runlevel_again.changed == false
|
||||||
- change_scheduled_task_run_options_runlevel_again.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
# Should ignore change as account being tested is a built-in service account
|
# Should ignore change as account being tested is a built-in service account
|
||||||
|
@ -312,7 +300,6 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- change_scheduled_task_run_options_store_password.changed == false
|
- change_scheduled_task_run_options_store_password.changed == false
|
||||||
- change_scheduled_task_run_options_store_password.exists == true
|
|
||||||
|
|
||||||
|
|
||||||
- name: Remove scheduled task run options 1
|
- name: Remove scheduled task run options 1
|
||||||
|
@ -323,12 +310,10 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_run_options_1.changed == true
|
- remove_scheduled_task_run_options_1.changed == true
|
||||||
- remove_scheduled_task_run_options_1.exists == true
|
|
||||||
when: not in_check_mode
|
when: not in_check_mode
|
||||||
|
|
||||||
- name: Test remove_scheduled_task_run_options_1 (check-mode)
|
- name: Test remove_scheduled_task_run_options_1 (check-mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- remove_scheduled_task_run_options_1.changed == false
|
- remove_scheduled_task_run_options_1.changed == false
|
||||||
- remove_scheduled_task_run_options_1.exists == false
|
|
||||||
when: in_check_mode
|
when: in_check_mode
|
||||||
|
|
635
test/integration/targets/win_scheduled_task/tasks/triggers.yml
Normal file
635
test/integration/targets/win_scheduled_task/tasks/triggers.yml
Normal file
|
@ -0,0 +1,635 @@
|
||||||
|
---
|
||||||
|
- name: create boot trigger (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: boot
|
||||||
|
register: trigger_boot_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create boot trigger (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_boot_result_check
|
||||||
|
|
||||||
|
- name: assert results of create boot trigger (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_boot_check|changed
|
||||||
|
- trigger_boot_result_check.task_exists == False
|
||||||
|
|
||||||
|
- name: create boot trigger
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: boot
|
||||||
|
register: trigger_boot
|
||||||
|
|
||||||
|
- name: get result of create boot trigger
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_boot_result
|
||||||
|
|
||||||
|
- name: assert results of create boot trigger
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_boot|changed
|
||||||
|
- trigger_boot_result.task_exists == True
|
||||||
|
- trigger_boot_result.task.triggers|count == 1
|
||||||
|
- trigger_boot_result.task.triggers[0].Type == "TASK_TRIGGER_BOOT"
|
||||||
|
- trigger_boot_result.task.triggers[0].Enabled == True
|
||||||
|
- trigger_boot_result.task.triggers[0].StartBoundary == None
|
||||||
|
- trigger_boot_result.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create boot trigger (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: boot
|
||||||
|
register: trigger_boot_again
|
||||||
|
|
||||||
|
- name: assert results of create boot trigger (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not trigger_boot_again|changed
|
||||||
|
|
||||||
|
- name: create daily trigger (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: daily
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
register: trigger_daily_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create daily trigger (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_daily_result_check
|
||||||
|
|
||||||
|
- name: assert results of create daily trigger (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_daily_check|changed
|
||||||
|
- trigger_daily_result_check.task_exists == True
|
||||||
|
- trigger_daily_result_check.task.triggers|count == 1
|
||||||
|
- trigger_daily_result_check.task.triggers[0].Type == "TASK_TRIGGER_BOOT"
|
||||||
|
- trigger_daily_result_check.task.triggers[0].Enabled == True
|
||||||
|
- trigger_daily_result_check.task.triggers[0].StartBoundary == None
|
||||||
|
- trigger_daily_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create daily trigger
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: daily
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
register: trigger_daily
|
||||||
|
|
||||||
|
- name: get result of create daily trigger
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_daily_result
|
||||||
|
|
||||||
|
- name: assert results of create daily trigger
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_daily|changed
|
||||||
|
- trigger_daily_result.task_exists == True
|
||||||
|
- trigger_daily_result.task.triggers|count == 1
|
||||||
|
- trigger_daily_result.task.triggers[0].Type == "TASK_TRIGGER_DAILY"
|
||||||
|
- trigger_daily_result.task.triggers[0].Enabled == True
|
||||||
|
- trigger_daily_result.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- trigger_daily_result.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create daily trigger (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: daily
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
register: trigger_daily_again
|
||||||
|
|
||||||
|
- name: assert results of create daily trigger (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not trigger_daily_again|changed
|
||||||
|
|
||||||
|
- name: create logon trigger (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: logon
|
||||||
|
register: trigger_logon_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create logon trigger (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_logon_result_check
|
||||||
|
|
||||||
|
- name: assert results of create logon trigger
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_logon_check|changed
|
||||||
|
- trigger_logon_result_check.task_exists == True
|
||||||
|
- trigger_logon_result_check.task.triggers|count == 1
|
||||||
|
- trigger_logon_result_check.task.triggers[0].Type == "TASK_TRIGGER_DAILY"
|
||||||
|
- trigger_logon_result_check.task.triggers[0].Enabled == True
|
||||||
|
- trigger_logon_result_check.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- trigger_logon_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create logon trigger
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: logon
|
||||||
|
register: trigger_logon
|
||||||
|
|
||||||
|
- name: get result of create logon trigger
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_logon_result
|
||||||
|
|
||||||
|
- name: assert results of create logon trigger
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_logon|changed
|
||||||
|
- trigger_logon_result.task_exists == True
|
||||||
|
- trigger_logon_result.task.triggers|count == 1
|
||||||
|
- trigger_logon_result.task.triggers[0].Type == "TASK_TRIGGER_LOGON"
|
||||||
|
- trigger_logon_result.task.triggers[0].Enabled == True
|
||||||
|
- trigger_logon_result.task.triggers[0].StartBoundary == None
|
||||||
|
- trigger_logon_result.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create logon trigger (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: logon
|
||||||
|
register: trigger_logon_again
|
||||||
|
|
||||||
|
- name: assert results of create logon trigger (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not trigger_logon_again|changed
|
||||||
|
|
||||||
|
- name: create monthly dow trigger (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthlydow
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
weeks_of_month: 1,2
|
||||||
|
days_of_week: [ "monday", "wednesday" ]
|
||||||
|
register: trigger_monthlydow_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create monthly dow trigger (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_monthlydow_result_check
|
||||||
|
|
||||||
|
- name: assert results of create monthly dow trigger (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_monthlydow_check|changed
|
||||||
|
- trigger_monthlydow_result_check.task_exists == True
|
||||||
|
- trigger_monthlydow_result_check.task.triggers|count == 1
|
||||||
|
- trigger_monthlydow_result_check.task.triggers[0].Type == "TASK_TRIGGER_LOGON"
|
||||||
|
- trigger_monthlydow_result_check.task.triggers[0].Enabled == True
|
||||||
|
- trigger_monthlydow_result_check.task.triggers[0].StartBoundary == None
|
||||||
|
- trigger_monthlydow_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: create monthly dow trigger
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthlydow
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
weeks_of_month: 1,2
|
||||||
|
days_of_week: [ "monday", "wednesday" ]
|
||||||
|
register: trigger_monthlydow
|
||||||
|
|
||||||
|
- name: get result of create monthly dow trigger
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: trigger_monthlydow_result
|
||||||
|
|
||||||
|
- name: assert results of create monthly dow trigger
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- trigger_monthlydow|changed
|
||||||
|
- trigger_monthlydow_result.task_exists == True
|
||||||
|
- trigger_monthlydow_result.task.triggers|count == 1
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].Type == "TASK_TRIGGER_MONTHLYDOW"
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].Enabled == True
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].EndBoundary == None
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].WeeksOfMonth == "1,2"
|
||||||
|
- trigger_monthlydow_result.task.triggers[0].DaysOfWeek == "monday,wednesday"
|
||||||
|
|
||||||
|
- name: create monthly dow trigger (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthlydow
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
weeks_of_month: 1,2
|
||||||
|
days_of_week: [ "monday", "wednesday" ]
|
||||||
|
register: trigger_monthlydow_again
|
||||||
|
|
||||||
|
- name: assert results of create monthly dow trigger (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not trigger_monthlydow_again|changed
|
||||||
|
|
||||||
|
- name: create task with multiple triggers (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthly
|
||||||
|
days_of_month: 1,5,10,15,20,25,30
|
||||||
|
run_on_last_day_of_month: true
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
months_of_year:
|
||||||
|
- march
|
||||||
|
- may
|
||||||
|
- july
|
||||||
|
- type: time
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
random_delay: PT10M5S
|
||||||
|
register: create_multiple_triggers_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of create task with multiple triggers (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_multiple_triggers_result_check
|
||||||
|
|
||||||
|
- name: assert results of create task with multiple triggers (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_multiple_triggers_check|changed
|
||||||
|
- create_multiple_triggers_result_check.task_exists == True
|
||||||
|
- create_multiple_triggers_result_check.task.triggers|count == 1
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].Type == "TASK_TRIGGER_MONTHLYDOW"
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].Enabled == True
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].WeeksOfMonth == "1,2"
|
||||||
|
- create_multiple_triggers_result_check.task.triggers[0].DaysOfWeek == "monday,wednesday"
|
||||||
|
|
||||||
|
- name: create task with multiple triggers
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthly
|
||||||
|
days_of_month: 1,5,10,15,20,25,30
|
||||||
|
run_on_last_day_of_month: true
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
months_of_year:
|
||||||
|
- march
|
||||||
|
- may
|
||||||
|
- july
|
||||||
|
- type: time
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
random_delay: PT10M5S
|
||||||
|
register: create_multiple_triggers
|
||||||
|
|
||||||
|
- name: get result of create task with multiple triggers
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: create_multiple_triggers_result
|
||||||
|
|
||||||
|
- name: assert results of create task with multiple triggers
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- create_multiple_triggers|changed
|
||||||
|
- create_multiple_triggers_result.task_exists == True
|
||||||
|
- create_multiple_triggers_result.task.triggers|count == 2
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].Type == "TASK_TRIGGER_MONTHLY"
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].Enabled == True
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].EndBoundary == None
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].DaysOfMonth == "1,5,10,15,20,25,30"
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].MonthsOfYear == "march,may,july"
|
||||||
|
- create_multiple_triggers_result.task.triggers[0].RunOnLastDayOfMonth == True
|
||||||
|
- create_multiple_triggers_result.task.triggers[1].Type == "TASK_TRIGGER_TIME"
|
||||||
|
- create_multiple_triggers_result.task.triggers[1].Enabled == True
|
||||||
|
- create_multiple_triggers_result.task.triggers[1].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- create_multiple_triggers_result.task.triggers[1].EndBoundary == None
|
||||||
|
- create_multiple_triggers_result.task.triggers[1].RandomDelay == "PT10M5S"
|
||||||
|
|
||||||
|
- name: create task with multiple triggers (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: monthly
|
||||||
|
days_of_month: 1,5,10,15,20,25,30
|
||||||
|
run_on_last_day_of_month: true
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
months_of_year:
|
||||||
|
- march
|
||||||
|
- may
|
||||||
|
- july
|
||||||
|
- type: time
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
random_delay: PT10M5S
|
||||||
|
register: create_multiple_triggers_again
|
||||||
|
|
||||||
|
- name: assert results of create task with multiple triggers (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not create_multiple_triggers_again|changed
|
||||||
|
|
||||||
|
- name: change task with multiple triggers (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: weekly
|
||||||
|
days_of_week: tuesday,friday
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: change_multiple_triggers_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of change task with multiple triggers (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: change_multiple_triggers_result_check
|
||||||
|
|
||||||
|
- name: assert results of change task with multiple triggers (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- change_multiple_triggers_check|changed
|
||||||
|
- change_multiple_triggers_result_check.task_exists == True
|
||||||
|
- change_multiple_triggers_result_check.task.triggers|count == 2
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].Type == "TASK_TRIGGER_MONTHLY"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].Enabled == True
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].DaysOfMonth == "1,5,10,15,20,25,30"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].MonthsOfYear == "march,may,july"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[0].RunOnLastDayOfMonth == True
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[1].Type == "TASK_TRIGGER_TIME"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[1].Enabled == True
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[1].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[1].EndBoundary == None
|
||||||
|
- change_multiple_triggers_result_check.task.triggers[1].RandomDelay == "PT10M5S"
|
||||||
|
|
||||||
|
- name: change task with multiple triggers
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: weekly
|
||||||
|
days_of_week: tuesday,friday
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: change_multiple_triggers
|
||||||
|
|
||||||
|
- name: get result of change task with multiple triggers
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: change_multiple_triggers_result
|
||||||
|
|
||||||
|
- name: assert results of change task with multiple triggers
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- change_multiple_triggers|changed
|
||||||
|
- change_multiple_triggers_result.task_exists == True
|
||||||
|
- change_multiple_triggers_result.task.triggers|count == 2
|
||||||
|
- change_multiple_triggers_result.task.triggers[0].Type == "TASK_TRIGGER_WEEKLY"
|
||||||
|
- change_multiple_triggers_result.task.triggers[0].Enabled == True
|
||||||
|
- change_multiple_triggers_result.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- change_multiple_triggers_result.task.triggers[0].EndBoundary == None
|
||||||
|
- change_multiple_triggers_result.task.triggers[0].DaysOfWeek == "tuesday,friday"
|
||||||
|
- change_multiple_triggers_result.task.triggers[1].Type == "TASK_TRIGGER_REGISTRATION"
|
||||||
|
- change_multiple_triggers_result.task.triggers[1].Enabled == False
|
||||||
|
- change_multiple_triggers_result.task.triggers[1].StartBoundary == None
|
||||||
|
- change_multiple_triggers_result.task.triggers[1].EndBoundary == None
|
||||||
|
|
||||||
|
- name: change task with multiple triggers (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: weekly
|
||||||
|
days_of_week: tuesday,friday
|
||||||
|
start_boundary: '2000-01-01T00:00:01'
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: change_multiple_triggers_again
|
||||||
|
|
||||||
|
- name: assert results of change task with multiple triggers (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not change_multiple_triggers_again|changed
|
||||||
|
|
||||||
|
- name: remove trigger from multiple triggers (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: remove_single_trigger_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of remove trigger from multiple triggers (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_single_trigger_result_check
|
||||||
|
|
||||||
|
- name: assert results of remove trigger from multiple triggers (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_single_trigger_check|changed
|
||||||
|
- remove_single_trigger_result_check.task_exists == True
|
||||||
|
- remove_single_trigger_result_check.task.triggers|count == 2
|
||||||
|
- remove_single_trigger_result_check.task.triggers[0].Type == "TASK_TRIGGER_WEEKLY"
|
||||||
|
- remove_single_trigger_result_check.task.triggers[0].Enabled == True
|
||||||
|
- remove_single_trigger_result_check.task.triggers[0].StartBoundary == "2000-01-01T00:00:01"
|
||||||
|
- remove_single_trigger_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
- remove_single_trigger_result_check.task.triggers[0].DaysOfWeek == "tuesday,friday"
|
||||||
|
- remove_single_trigger_result_check.task.triggers[1].Type == "TASK_TRIGGER_REGISTRATION"
|
||||||
|
- remove_single_trigger_result_check.task.triggers[1].Enabled == False
|
||||||
|
- remove_single_trigger_result_check.task.triggers[1].StartBoundary == None
|
||||||
|
- remove_single_trigger_result_check.task.triggers[1].EndBoundary == None
|
||||||
|
|
||||||
|
- name: remove trigger from multiple triggers
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: remove_single_trigger
|
||||||
|
|
||||||
|
- name: get result of remove trigger from multiple triggers
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_single_trigger_result
|
||||||
|
|
||||||
|
- name: assert results of remove trigger from multiple triggers
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_single_trigger|changed
|
||||||
|
- remove_single_trigger_result.task_exists == True
|
||||||
|
- remove_single_trigger_result.task.triggers|count == 1
|
||||||
|
- remove_single_trigger_result.task.triggers[0].Type == "TASK_TRIGGER_REGISTRATION"
|
||||||
|
- remove_single_trigger_result.task.triggers[0].Enabled == False
|
||||||
|
- remove_single_trigger_result.task.triggers[0].StartBoundary == None
|
||||||
|
- remove_single_trigger_result.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: remove trigger from multiple triggers (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers:
|
||||||
|
- type: registration
|
||||||
|
enabled: no
|
||||||
|
register: remove_single_trigger_again
|
||||||
|
|
||||||
|
- name: assert results of remove trigger from multiple triggers (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not remove_single_trigger_again|changed
|
||||||
|
|
||||||
|
- name: remove all triggers (check mode)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers: []
|
||||||
|
register: remove_triggers_check
|
||||||
|
check_mode: yes
|
||||||
|
|
||||||
|
- name: get result of remove all triggers (check mode)
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_triggers_result_check
|
||||||
|
|
||||||
|
- name: assert results of remove all triggers (check mode)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_triggers_check|changed
|
||||||
|
- remove_triggers_result_check.task_exists == True
|
||||||
|
- remove_triggers_result_check.task.triggers|count == 1
|
||||||
|
- remove_triggers_result_check.task.triggers[0].Type == "TASK_TRIGGER_REGISTRATION"
|
||||||
|
- remove_triggers_result_check.task.triggers[0].Enabled == False
|
||||||
|
- remove_triggers_result_check.task.triggers[0].StartBoundary == None
|
||||||
|
- remove_triggers_result_check.task.triggers[0].EndBoundary == None
|
||||||
|
|
||||||
|
- name: remove all triggers
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers: []
|
||||||
|
register: remove_triggers
|
||||||
|
|
||||||
|
- name: get result of remove all triggers
|
||||||
|
test_task_stat:
|
||||||
|
path: \
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
register: remove_triggers_result
|
||||||
|
|
||||||
|
- name: assert results of remove all triggers
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- remove_triggers|changed
|
||||||
|
- remove_triggers_result.task_exists == True
|
||||||
|
- remove_triggers_result.task.triggers|count == 0
|
||||||
|
|
||||||
|
- name: remove all triggers (idempotent)
|
||||||
|
win_scheduled_task:
|
||||||
|
name: '{{test_scheduled_task_name}}'
|
||||||
|
state: present
|
||||||
|
actions:
|
||||||
|
- path: cmd.exe
|
||||||
|
triggers: []
|
||||||
|
register: remove_triggers_again
|
||||||
|
|
||||||
|
- name: assert results of remove all triggers (idempotent)
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- not remove_triggers_again|changed
|
Loading…
Reference in a new issue