Skip to content

shell

Collection Note

This module is part of the ansible.builtin collection. To install the collection, use:

ansible-galaxy collection install ansible.builtin
Added in version 0.2.

Synopsis

  • The M(ansible.builtin.shell) module takes the command name followed by a list of space-delimited arguments.
  • Either a free form command or O(cmd) parameter is required, see the examples.
  • It is almost exactly like the M(ansible.builtin.command) module but runs the command through a shell (C(/bin/sh)) on the remote node.
  • For Windows targets, use the M(ansible.windows.win_shell) module instead.

Parameters

Parameter Defaults / Choices Comments
chdir
path
Change into this directory before running the command.
Version Added: 0.6
cmd
str
The command to run followed by optional arguments.
creates
path
A filename, when it already exists, this step will B(not) be run.
executable
path
Change the shell used to execute the command.
This expects an absolute path to the executable.
Version Added: 0.9
free_form
str
The shell module takes a free form command to run, as a string.
There is no actual parameter named 'free form'.
See the examples on how to use this module.
removes
path
A filename, when it does not exist, this step will B(not) be run.
Version Added: 0.8
stdin
str
Set the stdin of the command directly to the specified value.
Version Added: 2.4
stdin_add_newline
bool
Default: True
Whether to append a newline to stdin data.
Version Added: 2.8

Notes

Note

  • If you want to execute a command securely and predictably, it may be better to use the M(ansible.builtin.command) module instead. Best practices when writing playbooks will follow the trend of using M(ansible.builtin.command) unless the M(ansible.builtin.shell) module is explicitly required. When running ad-hoc commands, use your best judgement.
  • To sanitize any variables passed to the shell module, you should use C({{ var | quote }}) instead of just C({{ var }}) to make sure they do not include evil things like semicolons.
  • An alternative to using inline shell scripts with this module is to use the M(ansible.builtin.script) module possibly together with the M(ansible.builtin.template) module.
  • For rebooting systems, use the M(ansible.builtin.reboot) or M(ansible.windows.win_reboot) module.
  • If the command returns non UTF-8 data, it must be encoded to avoid issues. One option is to pipe the output through C(base64).

Examples

- name: Execute the command in remote shell; stdout goes to the specified file on the remote
  ansible.builtin.shell: somescript.sh >> somelog.txt

- name: Change the working directory to somedir/ before executing the command
  ansible.builtin.shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/

# You can also use the 'args' form to provide the options.
- name: This command will change the working directory to somedir/ and will only run when somedir/somelog.txt doesn't exist
  ansible.builtin.shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
    creates: somelog.txt

# You can also use the 'cmd' parameter instead of free form format.
- name: This command will change the working directory to somedir/
  ansible.builtin.shell:
    cmd: ls -l | grep log
    chdir: somedir/

- name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does)
  ansible.builtin.shell: cat < /tmp/*txt
  args:
    executable: /bin/bash

- name: Run a command using a templated variable (always use quote filter to avoid injection)
  ansible.builtin.shell: cat {{ myfile|quote }}

# You can use shell to run other executables to perform actions inline
- name: Run expect to wait for a successful PXE boot via out-of-band CIMC
  ansible.builtin.shell: |
    set timeout 300
    spawn ssh admin@{{ cimc_host }}

    expect "password:"
    send "{{ cimc_password }}\n"

    expect "\n{{ cimc_name }}"
    send "connect host\n"

    expect "pxeboot.n12"
    send "\n"

    exit 0
  args:
    executable: /usr/bin/expect
  delegate_to: localhost

Return Values

Key Data Type Description Returned
cmd str The command executed by the task. always
delta str The command execution delta time. always
end str The command execution end time. always
msg bool changed always
rc int The command return code (0 means success). always
start str The command execution start time. always
stderr str The command standard error. always
stderr_lines list The command standard error split in lines. always
stdout str The command standard output. always
stdout_lines list The command standard output split in lines. always

Authors

  • Ansible Core Team
  • Michael Dehaan