Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
7686204b
Commit
7686204b
authored
Jan 15, 2014
by
Richard C Isaacson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactored a few things to be more inline with the Ansible way. Passing testing.
parent
8388ce62
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
79 additions
and
87 deletions
+79
-87
library/system/at
+79
-87
No files found.
library/system/at
View file @
7686204b
...
@@ -25,13 +25,8 @@ short_description: Schedule the execution of a command or scripts via the at com
...
@@ -25,13 +25,8 @@ short_description: Schedule the execution of a command or scripts via the at com
description:
description:
- Use this module to schedule a command or script to run once in the future.
- Use this module to schedule a command or script to run once in the future.
- All jobs are executed in the a queue.
- All jobs are executed in the a queue.
version_added: "
0.0
"
version_added: "
1.5
"
options:
options:
user:
description:
- The user to execute the at command as.
required: false
default: null
command:
command:
description:
description:
- A command to be executed in the future.
- A command to be executed in the future.
...
@@ -42,22 +37,26 @@ options:
...
@@ -42,22 +37,26 @@ options:
- An existing script to be executed in the future.
- An existing script to be executed in the future.
required: false
required: false
default: null
default: null
unit_
count:
count:
description:
description:
- The count of units in the future to execute the command or script.
- The count of units in the future to execute the command or script.
required: true
required: true
unit
_type
:
unit
s
:
description:
description:
- The type of units in the future to execute the command or script.
- The type of units in the future to execute the command or script.
required: true
required: true
choices: ["minutes", "hours", "days", "weeks"]
choices: ["minutes", "hours", "days", "weeks"]
action
:
state
:
description:
description:
- The action to take for the job defaulting to add. Unique will verify that there is only one entry in the queue.
- The state dictates if the command or script_file should be evaluated as present(added) or absent(deleted).
- Delete will remove all existing queued jobs.
required: false
required: true
choices: ["present", "absent"]
choices: ["add", "delete", "unique"]
default: "present"
default: add
unique:
description:
- If a matching job is present a new job will not be added.
required: false
default: false
requirements:
requirements:
- at
- at
author: Richard Isaacson
author: Richard Isaacson
...
@@ -65,33 +64,41 @@ author: Richard Isaacson
...
@@ -65,33 +64,41 @@ author: Richard Isaacson
EXAMPLES
=
'''
EXAMPLES
=
'''
# Schedule a command to execute in 20 minutes as root.
# Schedule a command to execute in 20 minutes as root.
- at: command="ls -d / > /dev/null" unit_count=20 unit_type="minutes"
- at: command="ls -d / > /dev/null" count=20 units="minutes"
# Schedule a script to execute in 1 hour as the neo user.
- at: script_file="/some/script.sh" user="neo" unit_count=1 unit_type="hours"
# Match a command to an existing job and delete the job.
# Match a command to an existing job and delete the job.
- at: command="ls -d / > /dev/null"
action="delete
"
- at: command="ls -d / > /dev/null"
state="absent
"
# Schedule a command to execute in 20 minutes making sure it is unique in the queue.
# Schedule a command to execute in 20 minutes making sure it is unique in the queue.
- at: command="ls -d / > /dev/null"
action="unique" unit_count=20 unit_type
="minutes"
- at: command="ls -d / > /dev/null"
unique=true count=20 units
="minutes"
'''
'''
import
os
import
os
import
tempfile
import
tempfile
def
add_job
(
module
,
result
,
at_cmd
,
count
,
units
,
command
,
script_file
):
at_command
=
"
%
s now +
%
s
%
s -f
%
s"
%
(
at_cmd
,
count
,
units
,
script_file
)
rc
,
out
,
err
=
module
.
run_command
(
at_command
,
check_rc
=
True
)
if
command
:
os
.
unlink
(
script_file
)
result
[
'changed'
]
=
True
def
delete_job
(
module
,
result
,
at_cmd
,
command
,
script_file
):
for
matching_job
in
matching_jobs
(
module
,
at_cmd
,
script_file
):
at_command
=
"
%
s -d
%
s"
%
(
at_cmd
,
matching_job
)
rc
,
out
,
err
=
module
.
run_command
(
at_command
,
check_rc
=
True
)
result
[
'changed'
]
=
True
if
command
:
os
.
unlink
(
script_file
)
module
.
exit_json
(
**
result
)
def
matching_jobs
(
module
,
at_cmd
,
script_file
,
user
=
None
):
def
matching_jobs
(
module
,
at_cmd
,
script_file
):
matching_jobs
=
[]
matching_jobs
=
[]
atq_cmd
=
module
.
get_bin_path
(
'atq'
,
True
)
atq_cmd
=
module
.
get_bin_path
(
'atq'
,
True
)
# Get list of job numbers for the user.
# Get list of job numbers for the user.
atq_command
=
"
%
s"
%
(
atq_cmd
)
atq_command
=
"
%
s"
%
(
atq_cmd
)
if
user
:
rc
,
out
,
err
=
module
.
run_command
(
atq_command
,
check_rc
=
True
)
atq_command
=
"su '
%
s' -c '
%
s'"
%
(
user
,
atq_command
)
rc
,
out
,
err
=
module
.
run_command
(
atq_command
)
if
rc
!=
0
:
module
.
fail_json
(
msg
=
err
)
current_jobs
=
out
.
splitlines
()
current_jobs
=
out
.
splitlines
()
if
len
(
current_jobs
)
==
0
:
if
len
(
current_jobs
)
==
0
:
return
matching_jobs
return
matching_jobs
...
@@ -104,100 +111,85 @@ def matching_jobs(module, at_cmd, script_file, user=None):
...
@@ -104,100 +111,85 @@ def matching_jobs(module, at_cmd, script_file, user=None):
for
current_job
in
current_jobs
:
for
current_job
in
current_jobs
:
split_current_job
=
current_job
.
split
()
split_current_job
=
current_job
.
split
()
at_command
=
"
%
s -c
%
s"
%
(
at_cmd
,
split_current_job
[
0
])
at_command
=
"
%
s -c
%
s"
%
(
at_cmd
,
split_current_job
[
0
])
if
user
:
rc
,
out
,
err
=
module
.
run_command
(
at_command
,
check_rc
=
True
)
at_command
=
"su '
%
s' -c '
%
s'"
%
(
user
,
at_command
)
rc
,
out
,
err
=
module
.
run_command
(
at_command
)
if
rc
!=
0
:
module
.
fail_json
(
msg
=
err
)
if
script_file_string
in
out
:
if
script_file_string
in
out
:
matching_jobs
.
append
(
split_current_job
[
0
])
matching_jobs
.
append
(
split_current_job
[
0
])
# Return the list.
# Return the list.
return
matching_jobs
return
matching_jobs
def
create_tempfile
(
command
):
filed
,
script_file
=
tempfile
.
mkstemp
(
prefix
=
'at'
)
fileh
=
os
.
fdopen
(
filed
,
'w'
)
fileh
.
write
(
command
)
fileh
.
close
()
return
script_file
#================================================
#================================================
def
main
():
def
main
():
module
=
AnsibleModule
(
module
=
AnsibleModule
(
argument_spec
=
dict
(
argument_spec
=
dict
(
user
=
dict
(
required
=
False
),
command
=
dict
(
required
=
False
,
command
=
dict
(
required
=
False
),
type
=
'str'
),
script_file
=
dict
(
required
=
False
),
script_file
=
dict
(
required
=
False
,
unit_count
=
dict
(
required
=
False
,
type
=
'str'
),
count
=
dict
(
required
=
False
,
type
=
'int'
),
type
=
'int'
),
unit
_type
=
dict
(
required
=
False
,
unit
s
=
dict
(
required
=
False
,
default
=
None
,
default
=
None
,
choices
=
[
"minutes"
,
"hours"
,
"days"
,
"weeks"
],
choices
=
[
'minutes'
,
'hours'
,
'days'
,
'weeks'
],
type
=
"str"
),
type
=
'str'
),
action
=
dict
(
required
=
False
,
state
=
dict
(
required
=
False
,
default
=
"add"
,
default
=
'present'
,
choices
=
[
"add"
,
"delete"
,
"unique"
],
choices
=
[
'present'
,
'absent'
],
type
=
"str"
)
type
=
'str'
),
unique
=
dict
(
required
=
False
,
default
=
False
,
type
=
'bool'
)
),
),
supports_check_mode
=
False
,
mutually_exclusive
=
[[
'command'
,
'script_file'
]],
required_one_of
=
[[
'command'
,
'script_file'
]],
supports_check_mode
=
False
)
)
at_cmd
=
module
.
get_bin_path
(
'at'
,
True
)
at_cmd
=
module
.
get_bin_path
(
'at'
,
True
)
user
=
module
.
params
[
'user'
]
command
=
module
.
params
[
'command'
]
command
=
module
.
params
[
'command'
]
script_file
=
module
.
params
[
'script_file'
]
script_file
=
module
.
params
[
'script_file'
]
unit_count
=
module
.
params
[
'unit_count'
]
count
=
module
.
params
[
'count'
]
unit_type
=
module
.
params
[
'unit_type'
]
units
=
module
.
params
[
'units'
]
action
=
module
.
params
[
'action'
]
state
=
module
.
params
[
'state'
]
unique
=
module
.
params
[
'unique'
]
if
((
action
==
'add'
)
and
(
not
unit_count
or
not
unit_type
)):
module
.
fail_json
(
msg
=
"add action requires unit_count and unit_type"
)
if
(
not
command
)
and
(
not
script_file
):
module
.
fail_json
(
msg
=
"command or script_file not specified"
)
if
command
and
script_file
:
if
((
state
==
'present'
)
and
(
not
count
or
not
units
))
:
module
.
fail_json
(
msg
=
"
command and script_file are mutually exclusive
"
)
module
.
fail_json
(
msg
=
"
present state requires count and units
"
)
result
=
{}
result
=
{}
result
[
'
action'
]
=
action
result
[
'
state'
]
=
state
result
[
'changed'
]
=
False
result
[
'changed'
]
=
False
# If command transform it into a script_file
# If command transform it into a script_file
if
command
:
if
command
:
filed
,
script_file
=
tempfile
.
mkstemp
(
prefix
=
'at'
)
script_file
=
create_tempfile
(
command
)
fileh
=
os
.
fdopen
(
filed
,
'w'
)
fileh
.
write
(
command
)
# if absent remove existing and return
fileh
.
close
()
if
state
==
'absent'
:
delete_job
(
module
,
result
,
at_cmd
,
command
,
script_file
)
# if delete then return
if
action
==
'delete'
:
for
matching_job
in
matching_jobs
(
module
,
at_cmd
,
script_file
,
user
):
at_command
=
"
%
s -d
%
s"
%
(
at_cmd
,
matching_job
)
if
user
:
at_command
=
"su '
%
s' -c '
%
s'"
%
(
user
,
at_ccommand
)
rc
,
out
,
err
=
module
.
run_command
(
at_command
)
if
rc
!=
0
:
module
.
fail_json
(
msg
=
err
)
result
[
'changed'
]
=
True
module
.
exit_json
(
**
result
)
# if unique if existing return unchanged
# if unique if existing return unchanged
if
action
==
'unique'
:
if
unique
:
if
len
(
matching_jobs
(
module
,
at_cmd
,
script_file
,
user
))
!=
0
:
if
len
(
matching_jobs
(
module
,
at_cmd
,
script_file
))
!=
0
:
if
command
:
os
.
unlink
(
script_file
)
module
.
exit_json
(
**
result
)
module
.
exit_json
(
**
result
)
result
[
'script_file'
]
=
script_file
result
[
'script_file'
]
=
script_file
result
[
'unit_count'
]
=
unit_count
result
[
'count'
]
=
count
result
[
'unit_type'
]
=
unit_type
result
[
'units'
]
=
units
at_command
=
"
%
s now +
%
s
%
s -f
%
s"
%
(
at_cmd
,
unit_count
,
unit_type
,
script_file
)
add_job
(
module
,
result
,
at_cmd
,
count
,
units
,
command
,
script_file
)
if
user
:
# We expect that if this is an installed the permissions are already correct for the user to execute it.
at_command
=
"su '
%
s' -c '
%
s'"
%
(
user
,
at_command
)
rc
,
out
,
err
=
module
.
run_command
(
at_command
)
if
rc
!=
0
:
module
.
fail_json
(
msg
=
err
)
if
command
:
os
.
unlink
(
script_file
)
result
[
'changed'
]
=
True
module
.
exit_json
(
**
result
)
module
.
exit_json
(
**
result
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment