win_shell: Implement option 'profile', allowing the user to control p… (#54299)

* win_shell: Implement option 'profile', allowing the user to control powershell profile sourcing before running a command

* Set version_added to 2.8

* Make sure profile directory exists before writing profile file

* Changes to make tests immutable and align with ps args
This commit is contained in:
Blue 2019-03-28 02:28:28 +01:00 committed by Jordan Borean
parent e152b277cf
commit b62ab97685
3 changed files with 40 additions and 0 deletions

View file

@ -47,6 +47,7 @@ $executable = Get-AnsibleParam -obj $params -name "executable" -type "path"
$creates = Get-AnsibleParam -obj $params -name "creates" -type "path"
$removes = Get-AnsibleParam -obj $params -name "removes" -type "path"
$stdin = Get-AnsibleParam -obj $params -name "stdin" -type "str"
$no_profile = Get-AnsibleParam -obj $params -name "no_profile" -type "bool" -default $false
$raw_command_line = $raw_command_line.Trim()
@ -78,6 +79,10 @@ If(-not $executable -or $executable -eq "powershell") {
} else {
$exec_args = "-noninteractive -encodedcommand $encoded_command"
}
if ($no_profile) {
$exec_args = "-noprofile $exec_args"
}
}
Else {
# FUTURE: support arg translation from executable (or executable_args?) to process arguments for arbitrary interpreter?

View file

@ -47,6 +47,13 @@ options:
- Set the stdin of the command directly to the specified value.
type: str
version_added: '2.5'
no_profile:
description:
- Do not load the user profile before running a command. This is only valid
when using PowerShell as the executable.
type: bool
default: no
version_added: '2.8'
notes:
- If you want to run an executable securely and predictably, it may be
better to use the M(win_command) module instead. Best practices when writing

View file

@ -257,3 +257,31 @@
- nonascii_output.stdout_lines|count == 1
- nonascii_output.stdout_lines[0] == 'über den Fußgängerübergang gehen'
- nonascii_output.stderr == ''
- name: execute powershell without no_profile
win_shell: '[System.Environment]::CommandLine'
register: no_profile
- name: assert execute powershell with no_profile
assert:
that:
- no_profile is successful
- no_profile is changed
- no_profile.cmd == "[System.Environment]::CommandLine"
- no_profile.rc == 0
- no_profile.stdout is match ('^powershell.exe -noninteractive -encodedcommand')
- name: execute powershell with no_profile
win_shell: '[System.Environment]::CommandLine'
args:
no_profile: yes
register: no_profile
- name: assert execute powershell with no_profile
assert:
that:
- no_profile is successful
- no_profile is changed
- no_profile.cmd == "[System.Environment]::CommandLine"
- no_profile.rc == 0
- no_profile.stdout is match ('^powershell.exe -noprofile -noninteractive -encodedcommand')