Обновить playbooks/install_software_win.yml

This commit is contained in:
ogrechko committed 2026-10-02 12:14:07 +03:00
1 parent 3a09e9373b
commit e2c6acaef8
1 file changed
+31 -23
+31 -23
View File
@@ -20,62 +20,70 @@
vars: vars:
installer_args: "/S" 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: tasks:
- name: Check installer on share and list folder - name: Copy installer from share to local temp
ansible.windows.win_powershell: ansible.windows.win_powershell:
parameters: parameters:
Share: "{{ smb_path }}" Share: "{{ smb_path }}"
User: "{{ smb_user }}" User: "{{ smb_user }}"
Pass: "{{ smb_pass }}" Pass: "{{ smb_pass }}"
File: "{{ installer_file }}" File: "{{ installer_file }}"
Dest: "{{ local_dir }}"
script: | script: |
param($Share, $User, $Pass, $File) param($Share, $User, $Pass, $File, $Dest)
$ErrorActionPreference = 'Continue' $ErrorActionPreference = 'Continue'
$res = @{ exists = $false; files = @(); error = '' } $res = @{ copied = $false; files = @(); error = '' }
try { try {
& net.exe use $Share /delete /y 2>&1 | Out-Null & net.exe use $Share /delete /y 2>&1 | Out-Null
$out = & net.exe use $Share "/user:$User" $Pass 2>&1 | Out-String $out = & net.exe use $Share "/user:$User" $Pass 2>&1 | Out-String
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
$res.error = "net use failed (code $LASTEXITCODE): $out" $res.error = "net use failed (code $LASTEXITCODE): $out"
} else { } else {
$names = @(Get-ChildItem -LiteralPath $Share -ErrorAction Stop | Select-Object -ExpandProperty Name) $res.files = @(Get-ChildItem -LiteralPath $Share -ErrorAction Stop | Select-Object -ExpandProperty Name)
$res.files = $names $src = Join-Path $Share $File
$res.exists = [bool]($names -contains $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 & net.exe use $Share /delete /y 2>&1 | Out-Null
} }
} catch { } catch {
$res.error = $_.Exception.Message $res.error = $_.Exception.Message
} }
$Ansible.Result = $res $Ansible.Result = $res
register: share_check register: copy_result
no_log: true no_log: true
changed_when: false
failed_when: false failed_when: false
- name: Show share check result - name: Show copy result
ansible.builtin.debug: ansible.builtin.debug:
msg: msg:
error: "{{ share_check.result.error | default(share_check.msg | default('нет данных')) }}" error: "{{ copy_result.result.error | default(copy_result.msg | default('нет данных')) }}"
files: "{{ share_check.result.files | 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: ansible.builtin.fail:
msg: >- msg: "Не удалось скопировать {{ installer_file }}: {{ copy_result.result.error | default('неизвестная ошибка') }}"
{{ 'Ошибка доступа к шаре: ' ~ share_check.result.error when: not (copy_result.result.copied | default(false))
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))
- name: Install and clean up
block:
- name: Install {{ installer_file }} - name: Install {{ installer_file }}
ansible.windows.win_package: ansible.windows.win_package:
path: "{{ unc_file }}" path: "{{ local_file }}"
username: "{{ smb_user }}"
password: "{{ smb_pass }}"
state: present state: present
arguments: "{{ installer_args }}" arguments: "{{ installer_args }}"
product_id: "{{ product_id | default(omit) }}" product_id: "{{ product_id | default(omit) }}"
creates_path: "{{ creates_path | default(omit) }}" creates_path: "{{ creates_path | default(omit) }}"
no_log: true always:
- name: Remove local installer copy
ansible.windows.win_file:
path: "{{ local_dir }}"
state: absent