ansible.windows.win_shell module – Execute shell commands on target hosts
Note
This module is part of the ansible.windows collection (version 3.2.0).
It is not included in ansible-core.
To check whether it is installed, run ansible-galaxy collection list.
To install it, use: ansible-galaxy collection install ansible.windows.
To use it in a playbook, specify: ansible.windows.win_shell.
Synopsis
- The ansible.windows.win_shell module takes the command name followed by a list of space-delimited arguments. It is similar to the ansible.windows.win_command module, but runs the command via a shell (defaults to PowerShell) on the target host. 
- For non-Windows targets, use the ansible.builtin.shell module instead. 
Parameters
| Parameter | Comments | 
|---|---|
| Set the specified path as the current working directory before executing a command | |
| A path or path filter pattern; when the referenced path exists on the target host, the task will be skipped. | |
| Change the shell used to execute the command (eg,  The target shell must accept a  | |
| The ansible.windows.win_shell module takes a free form command to run. There is no parameter actually named ‘free form’. See the examples! | |
| Do not load the user profile before running a command. This is only valid when using PowerShell as the executable. Choices: 
 | |
| This option overrides the encoding of stdout/stderr output. You can use this option when you need to run a command which ignore the console’s codepage. You should only need to use this option in very rare circumstances. This value can be any valid encoding  | |
| A path or path filter pattern; when the referenced path does not exist on the target host, the task will be skipped. | |
| Set the stdin of the command directly to the specified value. | 
Notes
Note
- If you want to run an executable securely and predictably, it may be better to use the ansible.windows.win_command module instead. Best practices when writing playbooks will follow the trend of using ansible.windows.win_command unless - win_shellis explicitly required. When running ad-hoc commands, use your best judgement.
- WinRM will not return from a command execution until all child processes created have exited. Thus, it is not possible to use ansible.windows.win_shell to spawn long-running child or background processes. Consider creating a Windows service for managing background processes. - Consider using ansible.windows.win_powershell if you want to capture the output from the PowerShell script as structured objects. 
See Also
See also
- community.windows.psexec
- The official documentation on the community.windows.psexec module. 
- ansible.builtin.raw
- The official documentation on the ansible.builtin.raw module. 
- ansible.builtin.script
- The official documentation on the ansible.builtin.script module. 
- ansible.builtin.shell
- The official documentation on the ansible.builtin.shell module. 
- ansible.windows.win_command
- Executes a command on a remote Windows node. 
- ansible.windows.win_powershell
- Run PowerShell scripts. 
- community.windows.win_psexec
- The official documentation on the community.windows.win_psexec module. 
Examples
- name: Execute a command in the remote shell, stdout goes to the specified file on the remote
  ansible.windows.win_shell: C:\somescript.ps1 >> C:\somelog.txt
- name: Change the working directory to somedir/ before executing the command
  ansible.windows.win_shell: C:\somescript.ps1 >> C:\somelog.txt
  args:
    chdir: C:\somedir
- name: Run a command with an idempotent check on what it creates, will only run when somedir/somelog.txt does not exist
  ansible.windows.win_shell: C:\somescript.ps1 >> C:\somelog.txt
  args:
    chdir: C:\somedir
    creates: C:\somelog.txt
- name: Run a command under a non-Powershell interpreter (cmd in this case)
  ansible.windows.win_shell: echo %HOMEDIR%
  args:
    executable: cmd
  register: homedir_out
- name: Run multi-lined shell commands
  ansible.windows.win_shell: |
    $value = Test-Path -Path C:\temp
    if ($value) {
        Remove-Item -Path C:\temp -Force
    }
    New-Item -Path C:\temp -ItemType Directory
- name: Retrieve the input based on stdin
  ansible.windows.win_shell: '$string = [Console]::In.ReadToEnd(); Write-Output $string.Trim()'
  args:
    stdin: Input message
- name: Run a PowerShell script with -NoProfile
  ansible.windows.win_shell: C:\somescript.ps1
  args:
    no_profile: true
- name: Run a PowerShell script that outputs text with big5 encoding
  ansible.windows.win_shell: C:\somescript.ps1
  args:
    output_encoding_override: big5
Return Values
Common return values are documented here, the following are the fields unique to this module:
| Key | Description | 
|---|---|
| The command executed by the task. Returned: always Sample:  | |
| The command execution delta time. Returned: always Sample:  | |
| The command execution end time. Returned: always Sample:  | |
| Changed. Returned: always Sample:  | |
| The command return code (0 means success). Returned: always Sample:  | |
| The command execution start time. Returned: always Sample:  | |
| The command standard error. Returned: always Sample:  | |
| The command standard output. Returned: always Sample:  | |
| The command standard output split in lines. Returned: always Sample:  | 
