diff --git a/ansible/README.md b/ansible/README.md index 3c9d42a..671cfa8 100644 --- a/ansible/README.md +++ b/ansible/README.md @@ -105,7 +105,9 @@ Playbook: - если найден legacy config `C:\ProgramData\ActivityWatch-Phase2\deployment-config.json`, выполняет безопасную миграцию через `migrate-awatch-rus-paths.ps1`: backup, остановка задач, перенос данных, переписывание путей, пересоздание scheduled tasks и validation; - выполняет `deploy-ensemble.ps1` (deploy + hardening/recovery) с policy/rules из AWatch-rus toolkit; - после deploy принудительно запускает `ActivityWatch Recovery` и все `ActivityWatch Launch *` задачи; -- выполняет API smoke-check bucket `aw-watcher-afk_` и ожидает свежие `not-afk` события; +- включает (`Enable-ScheduledTask`) `ActivityWatch Recovery` и все `ActivityWatch Launch *` задачи перед запуском (иначе WebUI может показывать `Active time: 0s`); +- выполняет API smoke-check bucket `aw-watcher-afk_` и ожидает свежие события; +- выполняет API smoke-check bucket `aw-watcher-window_` и ожидает свежие события (по умолчанию включено); - запускает `validate-deployment.ps1`; - забирает JSON-отчёт в локальную директорию (`/tmp/aw-rus-validation` по умолчанию). @@ -125,6 +127,9 @@ Playbook: - `aw_windows_migration_report_remote_path` — JSON-отчёт о миграции на Windows-хосте; - `aw_windows_package_version`, `aw_windows_package_url`, `aw_windows_package_zip_path` — версия и источник Windows-пакета ActivityWatch; - `aw_windows_api_smoke_check_bucket: ""` — автоматически использовать `aw-watcher-afk_`; +- `aw_windows_api_smoke_check_window_enabled: true` — включить дополнительный smoke-check `aw-watcher-window_`; +- `aw_windows_api_smoke_check_window_bucket: ""` — переопределить bucket для window smoke-check; +- `aw_windows_api_smoke_check_min_events: 1` — минимум событий, ожидаемых в smoke-check; - `aw_windows_fail_on_validation_error: true` — завершать playbook ошибкой, если `validate-deployment.ps1` возвращает `overallOk=false`; - `aw_windows_skip_hardening: true` — пропустить `hardening-recovery.ps1` внутри ensemble-скрипта. diff --git a/ansible/deploy_aw_windows.yml b/ansible/deploy_aw_windows.yml index c80063f..1c0008e 100644 --- a/ansible/deploy_aw_windows.yml +++ b/ansible/deploy_aw_windows.yml @@ -42,6 +42,9 @@ aw_windows_api_smoke_check_enabled: true aw_windows_api_smoke_check_bucket: "" aw_windows_api_smoke_check_limit: 10 + aw_windows_api_smoke_check_window_enabled: true + aw_windows_api_smoke_check_window_bucket: "" + aw_windows_api_smoke_check_min_events: 1 aw_windows_fail_on_validation_error: true aw_windows_migration_enabled: true aw_windows_legacy_install_root: "C:\\Program Files\\ActivityWatch-Phase2" @@ -224,6 +227,17 @@ } Start-Sleep -Seconds 2 + + # Ensure tasks are enabled (some environments keep them disabled, causing "0s" in WebUI). + try { + Enable-ScheduledTask -TaskName "{{ aw_windows_recovery_task_name }}" -ErrorAction SilentlyContinue | Out-Null + } catch {} + Get-ScheduledTask | + Where-Object TaskName -like "{{ aw_windows_launch_task_pattern }}" | + ForEach-Object { + try { Enable-ScheduledTask -TaskName $_.TaskName -ErrorAction SilentlyContinue | Out-Null } catch {} + } + Start-ScheduledTask -TaskName "{{ aw_windows_recovery_task_name }}" Get-ScheduledTask | Where-Object TaskName -like "{{ aw_windows_launch_task_pattern }}" | @@ -232,7 +246,6 @@ - name: Получить Windows hostname для AW smoke-check bucket when: - aw_windows_api_smoke_check_enabled | bool - - aw_windows_afk_enabled | bool ansible.windows.win_command: powershell.exe -NoProfile -Command "$env:COMPUTERNAME" register: aw_windows_hostname_result changed_when: false @@ -250,7 +263,21 @@ else 'aw-watcher-afk_' ~ (aw_windows_hostname_result.stdout | trim) }} - - name: Выполнить AW API smoke-check (проверка наличия свежих событий в AFK бакете) + - name: Вычислить AW Window smoke-check bucket + when: + - aw_windows_api_smoke_check_enabled | bool + - aw_windows_api_smoke_check_window_enabled | bool + - aw_windows_window_enabled | bool + - aw_windows_hostname_result.stdout is defined + ansible.builtin.set_fact: + aw_windows_api_smoke_check_window_bucket_effective: >- + {{ + aw_windows_api_smoke_check_window_bucket + if (aw_windows_api_smoke_check_window_bucket | default('') | string | length) > 0 + else 'aw-watcher-window_' ~ (aw_windows_hostname_result.stdout | trim) + }} + + - name: Выполнить AW API smoke-check (AFK bucket должен получать события) when: - aw_windows_api_smoke_check_enabled | bool - aw_windows_afk_enabled | bool @@ -259,10 +286,25 @@ method: GET status_code: 200 register: aw_windows_api_smoke_result - until: aw_windows_api_smoke_result.json | length > 0 - retries: 5 + until: (aw_windows_api_smoke_result.json | length) >= aw_windows_api_smoke_check_min_events + retries: 12 delay: 5 - ignore_errors: true + ignore_errors: "{{ (not aw_windows_fail_on_validation_error | bool) }}" + + - name: Выполнить AW API smoke-check (Window bucket должен получать события) + when: + - aw_windows_api_smoke_check_enabled | bool + - aw_windows_api_smoke_check_window_enabled | bool + - aw_windows_window_enabled | bool + ansible.builtin.uri: + url: "{{ aw_windows_server_scheme }}://{{ aw_windows_server_host }}:{{ aw_windows_server_port }}/api/0/buckets/{{ aw_windows_api_smoke_check_window_bucket_effective }}/events?limit={{ aw_windows_api_smoke_check_limit }}" + method: GET + status_code: 200 + register: aw_windows_api_smoke_window_result + until: (aw_windows_api_smoke_window_result.json | length) >= aw_windows_api_smoke_check_min_events + retries: 12 + delay: 5 + ignore_errors: "{{ (not aw_windows_fail_on_validation_error | bool) }}" - name: Валидировать развёртывание на эндпоинте ansible.windows.win_powershell: