Ansible winrm программа не удаляется на Windows 10
Всем привет! Настраиваю аркестрацию Windows при помощи Ansible. Пытаюсь сделать первый этап, удаление установленной программы с Windows.
Всё настроил, проверил, на Windows создаётся директория после запуска ansible, но после таски по удалению софта с Windows ничего не происходит, софт остаётся на ОС Windows
Мой playbook
---
- name: Example
hosts: windows
tasks:
- name: Create directory
win_file:
path: d:\roschat
state: directory
- name: Get exe file from ftp
win_get_url:
url: ftp://10.10.199.31/releases/RosChat/client/roschat-client/01.06.2020_10%3A27_0.1-1143/windows/x64/roschat-0.1.1143.x64.exe
dest: d:\roschat
- name: Uninstall roschat
win_package:
path: "C:\\Program Files\\roschat\\Uninstall РосЧат.exe"
productid: '56e2ec90-1579-5edf-8225-77cb72eed1a1'
arguments: /allusers /S
state: absent
Уже перепробовал множество вариантов, но ПО так и не удаляется( Может кто сталкивался с такой проблемой?
Ответы (3 шт):
Пошёл другим путём. Получилось удалить при помощи PowerShell
Start-Process -NoNewWindow -FilePath 'C:\Program Files\roschat\Uninstall РосЧат.exe' -ArgumentList '/Queit /allusers /S /All'
Отключил для учётной записи UAC.
На Windows 10 команда отрабатывает и программа удаляется. Через Ansible программа не удаляется, хотя и выполняется
TASK [Uninstall roschat] ****************************************************************************************************************************************************
task path: /etc/ansible/windows/playbooks/windows.yml:18
Using module file /usr/lib/python2.7/dist-packages/ansible/modules/windows/win_shell.ps1
Pipelining is enabled.
<10.10.225.189> ESTABLISH WINRM CONNECTION FOR USER: bezpa on PORT 5986 TO 10.10.225.189
EXEC (via pipeline wrapper)
changed: [10.10.225.189] => {
"changed": true,
"cmd": "Start-Process -NoNewWindow -FilePath \"C:\\Program Files\\roschat\\Uninstall.exe\" -ArgumentList '/Queit /allusers /S /All'",
"delta": "0:00:00.416690",
"end": "2020-06-02 10:19:11.953841",
"rc": 0,
"start": "2020-06-02 10:19:11.537150",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
META: ran handlers
META: ran handlers
Переименовал файл, убрал русские буквы, но программа всё равно не удаляется.
Но 7-Zip через Ansible при выполнении этой же команды отлично удаляется. Как такое может быть?
Разобрался наконец-то. 2 дня гугления не прошли даром) Похоже дело было в правах на выполнение команд. Нужно было выполнять команды PowerShell от имени администратора. Мой финальный playbook
---
- name: Update windows x64 client
hosts: windows
tasks:
- name: Create temp directory
win_file:
path: d:\roschat
state: directory
- name: Get exe file from ftp
win_get_url:
url: ftp://10.10.199.31/releases/RosChat/client/roschat-client/01.06.2020_10%3A27_0.1-1143/windows/x64/roschat-0.1.1143.x64.exe
dest: d:\roschat
- name: Update roschat client
win_shell: |
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
$roschat = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' | Get-ItemProperty | Where-Object {$_.DisplayName -match "РосЧат" } | Select-Object -Property UninstallString
$roschat = $roschat.UninstallString.Replace('{',' ').Replace('}',' ').Replace('/allusers','')
if($roschat){
Start-Process -NoNewWindow -FilePath $roschat -ArgumentList '/Queit /allusers /S /All'
}
Start-Process -NoNewWindow -FilePath 'D:\roschat\roschat-*.x64.exe' -ArgumentList '/Queit /S'
- name: Delete temp directory
win_file:
path: d:\roschat
state: absent
Через стандартный модуль win_package не поехало. Скажи "спасибо" разрабам за то, что используют какое-то палево, а не msi. 7-zip, кстати использует именно его, поэтому там проблем не возникло.
---
- name: Uninstall roschat
hosts: all
strategy: free
serial:
- "100%"
vars:
roschat_state: absent
tasks:
- name: Uninstall roschat 4 Windows
when:
- ansible_os_family == 'Windows'
- roschat_state == 'absent'
become: yes
become_method: runas
become_flags: logon_type=new_credentials logon_flags=netcredentials_only
block:
- win_stat:
path: '{{ ansible_env.ProgramFiles }}\roschat\Uninstall РосЧат.exe'
register: roschat_installed_state
- win_shell: cmd.exe /k "Uninstall РосЧат.exe" /S
args:
chdir: '{{ ansible_env.ProgramFiles }}\roschat'
when: roschat_installed_state.stat.exists == true
tags:
- windows
- uninstall
P.S. Идемпотентность в комплекте, кстати.