Add 'stdin' argument to command/shell modules

Fixes #14380 #23428
This commit is contained in:
Andy Freeland 2017-07-26 10:14:59 -07:00 committed by Toshio Kuratomi
parent d52c0242c2
commit 393909d0cc
3 changed files with 44 additions and 1 deletions

View file

@ -49,6 +49,12 @@ options:
type: bool type: bool
default: 'yes' default: 'yes'
version_added: "1.8" version_added: "1.8"
stdin:
version_added: "2.4"
description:
- Set the stdin of the command directly to the specified value.
required: false
default: null
notes: notes:
- If you want to run a command through the shell (say you are using C(<), C(>), C(|), etc), you actually want the M(shell) module instead. - If you want to run a command through the shell (say you are using C(<), C(>), C(|), etc), you actually want the M(shell) module instead.
The C(command) module is much more secure as it's not affected by the user's environment. The C(command) module is much more secure as it's not affected by the user's environment.
@ -121,6 +127,7 @@ def main():
creates=dict(type='path'), creates=dict(type='path'),
removes=dict(type='path'), removes=dict(type='path'),
warn=dict(type='bool', default=True), warn=dict(type='bool', default=True),
stdin=dict(required=False),
) )
) )
@ -131,6 +138,7 @@ def main():
creates = module.params['creates'] creates = module.params['creates']
removes = module.params['removes'] removes = module.params['removes']
warn = module.params['warn'] warn = module.params['warn']
stdin = module.params['stdin']
if not shell and executable: if not shell and executable:
module.warn("As of Ansible 2.4, the parameter 'executable' is no longer supported with the 'command' module. Not using '%s'." % executable) module.warn("As of Ansible 2.4, the parameter 'executable' is no longer supported with the 'command' module. Not using '%s'." % executable)
@ -174,7 +182,7 @@ def main():
args = shlex.split(args) args = shlex.split(args)
startd = datetime.datetime.now() startd = datetime.datetime.now()
rc, out, err = module.run_command(args, executable=executable, use_unsafe_shell=shell, encoding=None) rc, out, err = module.run_command(args, executable=executable, use_unsafe_shell=shell, encoding=None, data=stdin)
endd = datetime.datetime.now() endd = datetime.datetime.now()
delta = endd - startd delta = endd - startd

View file

@ -60,6 +60,12 @@ options:
required: false required: false
default: True default: True
version_added: "1.8" version_added: "1.8"
stdin:
version_added: "2.4"
description:
- Set the stdin of the command directly to the specified value.
required: false
default: null
notes: notes:
- If you want to execute a command securely and predictably, it may be - If you want to execute a command securely and predictably, it may be
better to use the M(command) module instead. Best practices when writing better to use the M(command) module instead. Best practices when writing

View file

@ -121,6 +121,35 @@
that: that:
- "command_result4.changed != True" - "command_result4.changed != True"
- name: pass stdin to cat via command
command: "cat"
args:
stdin: 'foobar'
register: command_result5
- name: assert that stdin is passed
assert:
that:
- "command_result5.stdout == 'foobar'"
- name: send to stdin literal multiline block
command: "{{ sha1sum.stdout }}"
args:
stdin: |-
this is the first line
this is the second line
this line is after an empty line
this line is the last line
register: command_result6
- debug: var=command_result6
- name: assert the multiline input was passed correctly
assert:
that:
- "command_result6.stdout == 'b1a4df888d8d261876dc33ded211ba3ebe803010 -'"
## ##
## shell ## shell
## ##