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
aaf0a182
Commit
aaf0a182
authored
Feb 24, 2014
by
Richard C Isaacson
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'jeromew/ansible_script_creates' into issues_4986
parents
e2a47162
7a14cb61
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
69 additions
and
2 deletions
+69
-2
lib/ansible/runner/action_plugins/script.py
+51
-2
library/commands/script
+18
-0
No files found.
lib/ansible/runner/action_plugins/script.py
View file @
aaf0a182
...
...
@@ -16,6 +16,7 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
import
os
import
re
import
shlex
import
ansible.constants
as
C
...
...
@@ -38,12 +39,60 @@ class ActionModule(object):
# in check mode, always skip this module
return
ReturnData
(
conn
=
conn
,
comm_ok
=
True
,
result
=
dict
(
skipped
=
True
,
msg
=
'check mode not supported for this module'
))
# extract ansible reserved parameters
# From library/command keep in sync
creates
=
None
removes
=
None
r
=
re
.
compile
(
r'(^|\s)(creates|removes)=(?P<quote>[\'"])?(.*?)(?(quote)(?<!\\)(?P=quote))((?<!\\)(?=\s)|$)'
)
for
m
in
r
.
finditer
(
module_args
):
v
=
m
.
group
(
4
)
.
replace
(
"
\\
"
,
""
)
if
m
.
group
(
2
)
==
"creates"
:
creates
=
v
elif
m
.
group
(
2
)
==
"removes"
:
removes
=
v
module_args
=
r
.
sub
(
""
,
module_args
)
if
creates
:
# do not run the command if the line contains creates=filename
# and the filename already exists. This allows idempotence
# of command executions.
module_args_tmp
=
"path=
%
s"
%
creates
module_return
=
self
.
runner
.
_execute_module
(
conn
,
tmp
,
'stat'
,
module_args_tmp
,
inject
=
inject
,
complex_args
=
complex_args
,
persist_files
=
True
)
stat
=
module_return
.
result
.
get
(
'stat'
,
None
)
if
stat
and
stat
.
get
(
'exists'
,
False
):
return
ReturnData
(
conn
=
conn
,
comm_ok
=
True
,
result
=
dict
(
skipped
=
True
,
msg
=
(
"skipped, since
%
s exists"
%
creates
)
)
)
if
removes
:
# do not run the command if the line contains removes=filename
# and the filename does not exist. This allows idempotence
# of command executions.
module_args_tmp
=
"path=
%
s"
%
removes
module_return
=
self
.
runner
.
_execute_module
(
conn
,
tmp
,
'stat'
,
module_args_tmp
,
inject
=
inject
,
complex_args
=
complex_args
,
persist_files
=
True
)
stat
=
module_return
.
result
.
get
(
'stat'
,
None
)
if
stat
and
not
stat
.
get
(
'exists'
,
False
):
return
ReturnData
(
conn
=
conn
,
comm_ok
=
True
,
result
=
dict
(
skipped
=
True
,
msg
=
(
"skipped, since
%
s does not exist"
%
removes
)
)
)
# Decode the result of shlex.split() to UTF8 to get around a bug in that's been fixed in Python 2.7 but not Python 2.6.
# See: http://bugs.python.org/issue6988
tokens
=
shlex
.
split
(
module_args
.
encode
(
'utf8'
))
tokens
=
[
s
.
decode
(
'utf8'
)
for
s
in
tokens
]
# extract source script
source
=
tokens
[
0
]
# FIXME: error handling
args
=
" "
.
join
(
tokens
[
1
:])
source
=
template
.
template
(
self
.
runner
.
basedir
,
source
,
inject
)
...
...
@@ -56,7 +105,7 @@ class ActionModule(object):
source
=
source
.
replace
(
'
\x00
'
,
''
)
# why does this happen here?
args
=
args
.
replace
(
'
\x00
'
,
''
)
# why does this happen here?
tmp_src
=
os
.
path
.
join
(
tmp
,
os
.
path
.
basename
(
source
))
tmp_src
=
tmp_src
.
replace
(
'
\x00
'
,
''
)
tmp_src
=
tmp_src
.
replace
(
'
\x00
'
,
''
)
conn
.
put_file
(
source
,
tmp_src
)
...
...
library/commands/script
View file @
aaf0a182
...
...
@@ -18,6 +18,18 @@ options:
required: true
default: null
aliases: []
creates:
description:
- a filename, when it already exists, this step will B(not) be run.
required: no
default: null
version_added: "1.5"
removes:
description:
- a filename, when it does not exist, this step will B(not) be run.
required: no
default: null
version_added: "1.5"
notes:
- It is usually preferable to write Ansible modules than pushing scripts. Convert your script to an Ansible module for bonus points!
author: Michael DeHaan
...
...
@@ -26,4 +38,10 @@ author: Michael DeHaan
EXAMPLES = '''
# Example from Ansible Playbooks
- script: /some/local/script.sh --some-arguments 1234
# Run a script that creates a file, but only if the file is not yet created
- script: /some/local/create_file.sh --some-arguments 1234 creates=/the/created/file.txt
# Run a script that removes a file, but only if the file is not yet removed
- script: /some/local/remove_file.sh --some-arguments 1234 removes=/the/removed/file.txt
'''
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