win_msi: Add check_mode and removes options (#26086)

This PR includes:
- Add support for the removes option
- Add check_mode support (which does test MSI file, creates, removes)
- Simplify code
pull/25756/merge
Dag Wieers 7 years ago committed by Jordan Borean
parent bb7ebc6a55
commit 58b348ddf5

@ -19,13 +19,13 @@
# WANT_JSON # WANT_JSON
# POWERSHELL_COMMON # POWERSHELL_COMMON
# TODO: Add check-mode support $params = Parse-Args $args -supports_check_mode $true
$check_mode = Get-AnsibleParam -obj $params -name "_ansible_check_mode" -type "bool" -default $false
$params = Parse-Args $args
$path = Get-AnsibleParam -obj $params -name "path" -type "path" -failifempty $true $path = Get-AnsibleParam -obj $params -name "path" -type "path" -failifempty $true
$state = Get-AnsibleParam -obj $params -name "state" -type "str" -default "present" -validateset "present","absent" $state = Get-AnsibleParam -obj $params -name "state" -type "str" -default "present" -validateset "absent","present"
$creates = Get-AnsibleParam -obj $params -name "creates" -type "path" $creates = Get-AnsibleParam -obj $params -name "creates" -type "path"
$removes = Get-AnsibleParam -obj $params -name "removes" -type "path"
$extra_args = Get-AnsibleParam -obj $params -name "extra_args" -type "str" -default "" $extra_args = Get-AnsibleParam -obj $params -name "extra_args" -type "str" -default ""
$wait = Get-AnsibleParam -obj $params -name "wait" -type "bool" -default $false $wait = Get-AnsibleParam -obj $params -name "wait" -type "bool" -default $false
@ -33,35 +33,31 @@ $result = @{
changed = $false changed = $false
} }
if (($creates -ne $null) -and ($state -ne "absent") -and (Test-Path $creates)) { if (-not (Test-Path -Path $path)) {
Exit-Json $result Fail-Json $result "The MSI file ($path) was not found."
} }
if (-not (Test-Path $path)) { if ($creates -and (Test-Path -Path $creates)) {
Fail-Json $result "Cannot find $path." Exit-Json $result "The 'creates' file or directory ($creates) already exists."
} }
$logfile = [IO.Path]::GetTempFileName() if ($removes -and -not (Test-Path -Path $removes)) {
if ($state -eq "absent") { Exit-Json $result "The 'removes' file or directory ($removes) does not exist."
}
if ($wait) {
Start-Process -FilePath msiexec.exe -ArgumentList "/x `"$path`" /qn /l $logfile $extra_args" -Verb Runas -Wait
} else {
Start-Process -FilePath msiexec.exe -ArgumentList "/x `"$path`" /qn /l $logfile $extra_args" -Verb Runas
}
} else { if (-not $check_mode) {
if ($wait) { $logfile = [IO.Path]::GetTempFileName()
Start-Process -FilePath msiexec.exe -ArgumentList "/i `"$path`" /qn /l $logfile $extra_args" -Verb Runas -Wait if ($state -eq "absent") {
Start-Process -FilePath msiexec.exe -ArgumentList "/x `"$path`" /qn /log $logfile $extra_args" -Verb Runas -Wait:$wait
} else { } else {
Start-Process -FilePath msiexec.exe -ArgumentList "/i `"$path`" /qn /l $logfile $extra_args" -Verb Runas Start-Process -FilePath msiexec.exe -ArgumentList "/i `"$path`" /qn /log $logfile $extra_args" -Verb Runas -Wait:$wait
} }
$result.log = Get-Content $logfile | Out-String
Remove-Item $logfile
} }
$result.changed = $true $result.changed = $true
$result.log = Get-Content $logfile | Out-String
Remove-Item $logfile
Exit-Json $result Exit-Json $result

@ -25,15 +25,14 @@ ANSIBLE_METADATA = {'metadata_version': '1.0',
'status': ['deprecated'], 'status': ['deprecated'],
'supported_by': 'community'} 'supported_by': 'community'}
DOCUMENTATION = r''' DOCUMENTATION = r'''
--- ---
module: win_msi module: win_msi
version_added: "1.7" version_added: '1.7'
short_description: Installs and uninstalls Windows MSI files short_description: Installs and uninstalls Windows MSI files
description: description:
- Installs or uninstalls a Windows MSI file that is already located on the - Installs or uninstalls a Windows MSI file that is already located on the
target server target server.
options: options:
path: path:
description: description:
@ -41,30 +40,33 @@ options:
required: true required: true
extra_args: extra_args:
description: description:
- Additional arguments to pass to the msiexec.exe command - Additional arguments to pass to the msiexec.exe command.
state: state:
description: description:
- Whether the MSI file should be installed or uninstalled - Whether the MSI file should be installed or uninstalled.
choices: choices: [ absent, present ]
- present
- absent
default: present default: present
creates: creates:
description: description:
- Path to a file created by installing the MSI to prevent from - Path to a file created by installing the MSI to prevent from
attempting to reinstall the package on every run attempting to reinstall the package on every run.
removes:
description:
- Path to a file removed by uninstalling the MSI to prevent from
attempting to re-uninstall the package on every run.
version_added: '2.4'
wait: wait:
version_added: "2.1"
description: description:
- Specify whether to wait for install or uninstall to complete before continuing. - Specify whether to wait for install or uninstall to complete before continuing.
choices: type: bool
- true default: 'no'
- false version_added: '2.1'
default: false
notes: notes:
- Check-mode support is currently not supported. - This module is not idempotent and will report a change every time.
- Please look into M(win_package) instead, this package will be deprecated in Ansible v2.3. Use the C(creates) and C(removes) options to your advantage.
author: "Matt Martz (@sivel)" - Please look into M(win_package) instead, this package will be deprecated in the future.
author:
- Matt Martz (@sivel)
''' '''
EXAMPLES = r''' EXAMPLES = r'''
@ -75,10 +77,18 @@ EXAMPLES = r'''
- name: Install an MSI, and wait for it to complete before continuing - name: Install an MSI, and wait for it to complete before continuing
win_msi: win_msi:
path: C:\7z920-x64.msi path: C:\7z920-x64.msi
wait: true wait: yes
- name: Uninstall an MSI file - name: Uninstall an MSI file
win_msi: win_msi:
path: C:\7z920-x64.msi path: C:\7z920-x64.msi
state: absent state: absent
''' '''
RETURN = r'''
log:
description: The logged output from the installer
returned: always
type: string
sample: N/A
'''

Loading…
Cancel
Save