Ansible winrm программа не удаляется на Windows 10

Попробовал удалить 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]

Я настраивал по этой инструкции

Обновить надо бы…


И может, всё пройдёт.

1 лайк

Пока не прошло( Завтра продолжу) Спасибо всем за участие;)

Пошёл другим путём. Получилось удалить при помощи 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 при выполнении этой же команды отлично удаляется. Как такое может быть?

1 лайк

Передам разработчикам :joy:

Решил сделать пока так:

  1. После сборки exe’шника ansible создает директорию и скачивает или копирует файл на Windows
  2. На Windows в планировщике задач крутится powershell скрипт, который смотри в папочке, если есть exe файл, удаляет ПО старой версии и устанавливает новое.

Вопрос остаётся, как вернуть результат удаления/установки?

2 дня гугления и куча вариантов принесли таки свои плоды) Видимо для удаления/установки не хватало прав. Итак вот так заработало:

Написал вот такой PowerShell скрипт. Ну как написал Copy/Paste в основном :slightly_smiling_face:

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"

Наконец-то долгожданная переустановка ПО заработала. Осталось добавить проверки и взять с полки пирожок;)

Учётка по которой ансибл гуляет в группе админов-то?

1 лайк

Да, конечно. Но для выполнения установки нужно всё равно было запускать 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)

2 лайка

На 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

И тоже обозвали софт нехорошим словом;)

Вот-вот, проблема в софте. :slight_smile:

1 лайк