Попробовал удалить 7-Zip. Получилось. Значит такой вариант работает, но не для нашего софта( Пойду дальше читать, может что-то найду
ansible 2.8.3
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/pbezpal/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.5 (default, Apr 19 2020, 20:18:17) [GCC 9.2.1 20191008]
Я настраивал по этой инструкции
Пока не прошло( Завтра продолжу) Спасибо всем за участие;)
Пошёл другим путём. Получилось удалить при помощи 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 при выполнении этой же команды отлично удаляется. Как такое может быть?
Передам разработчикам
Решил сделать пока так:
- После сборки exe’шника ansible создает директорию и скачивает или копирует файл на Windows
- На Windows в планировщике задач крутится powershell скрипт, который смотри в папочке, если есть exe файл, удаляет ПО старой версии и устанавливает новое.
Вопрос остаётся, как вернуть результат удаления/установки?
2 дня гугления и куча вариантов принесли таки свои плоды) Видимо для удаления/установки не хватало прав. Итак вот так заработало:
Написал вот такой PowerShell скрипт. Ну как написал Copy/Paste в основном
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
}
Start-Process -NoNewWindow -FilePath 'C:\Program Files\roschat\Uninstall РосЧат.exe' -ArgumentList '/Queit /allusers /S /All'
Start-Process -NoNewWindow -FilePath 'D:\roschat\roschat-*.x64.exe' -ArgumentList '/Queit /S'
PlayBook ansible
- name: Uninstall roschat
win_shell: "D:\\remote_job\\test.ps1"
Наконец-то долгожданная переустановка ПО заработала. Осталось добавить проверки и взять с полки пирожок;)
Учётка по которой ансибл гуляет в группе админов-то?
Да, конечно. Но для выполнения установки нужно всё равно было запускать 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
Пока остановлюсь на этом. Следующий этап, прикрутить всё это к jenkins)
На stackoverflow предложили такое решение
---
- 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
И тоже обозвали софт нехорошим словом;)
Вот-вот, проблема в софте.