diff --git a/playbooks/install_software_win.yml b/playbooks/install_software_win.yml index 5c95429..0c8d854 100644 --- a/playbooks/install_software_win.yml +++ b/playbooks/install_software_win.yml @@ -20,62 +20,70 @@ vars: installer_args: "/S" - unc_file: "{{ smb_path | regex_replace('\\\\+$', '') }}\\{{ installer_file }}" + local_dir: 'C:\Windows\Temp\ansible_install' + local_file: "{{ local_dir }}\\{{ installer_file }}" tasks: - - name: Check installer on share and list folder + - name: Copy installer from share to local temp ansible.windows.win_powershell: parameters: Share: "{{ smb_path }}" User: "{{ smb_user }}" Pass: "{{ smb_pass }}" File: "{{ installer_file }}" + Dest: "{{ local_dir }}" script: | - param($Share, $User, $Pass, $File) + param($Share, $User, $Pass, $File, $Dest) $ErrorActionPreference = 'Continue' - $res = @{ exists = $false; files = @(); error = '' } + $res = @{ copied = $false; files = @(); error = '' } try { & net.exe use $Share /delete /y 2>&1 | Out-Null $out = & net.exe use $Share "/user:$User" $Pass 2>&1 | Out-String if ($LASTEXITCODE -ne 0) { $res.error = "net use failed (code $LASTEXITCODE): $out" } else { - $names = @(Get-ChildItem -LiteralPath $Share -ErrorAction Stop | Select-Object -ExpandProperty Name) - $res.files = $names - $res.exists = [bool]($names -contains $File) + $res.files = @(Get-ChildItem -LiteralPath $Share -ErrorAction Stop | Select-Object -ExpandProperty Name) + $src = Join-Path $Share $File + if (-not (Test-Path -LiteralPath $src)) { + $res.error = "Файл $File не найден на шаре" + } else { + New-Item -ItemType Directory -Path $Dest -Force | Out-Null + Copy-Item -LiteralPath $src -Destination $Dest -Force -ErrorAction Stop + $res.copied = $true + } & net.exe use $Share /delete /y 2>&1 | Out-Null } } catch { $res.error = $_.Exception.Message } $Ansible.Result = $res - register: share_check + register: copy_result no_log: true + changed_when: false failed_when: false - - name: Show share check result + - name: Show copy result ansible.builtin.debug: msg: - error: "{{ share_check.result.error | default(share_check.msg | default('нет данных')) }}" - files: "{{ share_check.result.files | default([]) }}" + error: "{{ copy_result.result.error | default(copy_result.msg | default('нет данных')) }}" + files: "{{ copy_result.result.files | default([]) }}" - - name: Fail if share unavailable or file missing + - name: Fail if copy did not succeed ansible.builtin.fail: - msg: >- - {{ 'Ошибка доступа к шаре: ' ~ share_check.result.error - if (share_check.result.error | default('')) != '' - else 'Файл ' ~ installer_file ~ ' не найден в ' ~ smb_path }} - when: >- - (share_check.result.error | default('x')) != '' or - not (share_check.result.exists | default(false)) + msg: "Не удалось скопировать {{ installer_file }}: {{ copy_result.result.error | default('неизвестная ошибка') }}" + when: not (copy_result.result.copied | default(false)) - - name: Install {{ installer_file }} - ansible.windows.win_package: - path: "{{ unc_file }}" - username: "{{ smb_user }}" - password: "{{ smb_pass }}" - state: present - arguments: "{{ installer_args }}" - product_id: "{{ product_id | default(omit) }}" - creates_path: "{{ creates_path | default(omit) }}" - no_log: true \ No newline at end of file + - name: Install and clean up + block: + - name: Install {{ installer_file }} + ansible.windows.win_package: + path: "{{ local_file }}" + state: present + arguments: "{{ installer_args }}" + product_id: "{{ product_id | default(omit) }}" + creates_path: "{{ creates_path | default(omit) }}" + always: + - name: Remove local installer copy + ansible.windows.win_file: + path: "{{ local_dir }}" + state: absent \ No newline at end of file