У меня есть проблема, которую я не видел раньше. Я запускаю Ansible 2.7.6 в среде CI. Мой хост - это Windows 10 на OpenStack из образа облака, который я создал с помощью Packer и VirtualBox. Пока все работает нормально. Я представил вторую задачу среди многих, где я хотел уведомить мой обработчик перезагрузки, и теперь я получаю несколько перезагрузок.
Это моя игра и задачи, несколько очищенные для удобства чтения. Требуемая обработка ошибок для достижения идемпотентности с помощью win_shell и довольно:
- hosts: workstations
tasks:
...
- name: Enable Windows feature
include_role: name=win-config tasks_from=feature
- name: Install language pack
include_role: name=win-config tasks_from=language-pack
...
tasks/feature.yml
:
- name: Inspect feature
win_shell: DISM /Online /Get-FeatureInfo /FeatureName:Microsoft-Hyper-V
register: check
- name: Enable Windows feature
win_shell: DISM /Online /Enable-Feature /All /FeatureName:Microsft-Hyper-V /NoRestart
notify: Reboot
when: '"Disabled" in check.stdout_lines[12]'
tasks/language-pack.yml
:
- name: Check language pack
win_shell: |
Get-WindowsPackage -Online `
-PackagePath 'C:\Programdata\cab\Microsoft-Windows-Client-Language-Pack_x64_sv-se.cab' `
| Select-Object `
-ExpandProperty PackageState
register: check
- name: Install language pack
win_shell: |
Add-WindowsPackage -Online `
-PackagePath 'C:\Programdata\cab\Microsoft-Windows-Client-Language-Pack_x64_sv-se.cab' `
-NoRestart
when: '"Installed" not in check.stdout'
notify: Reboot
handlers/main.yml
:
- name: Reboot
win_reboot:
post_reboot_delay: 60
результат:
tasks run with status `changed` and the end of play unfolds...
...
RUNNING HANDLER [win-config : Reboot] ******************************************
Sunday 20 October 2019 18:48:55 +0200 (0:00:00.057) 0:46:55.167 ********
changed: [node1.example.com]
RUNNING HANDLER [win-config : Reboot] ******************************************
Sunday 20 October 2019 18:51:11 +0200 (0:02:16.527) 0:49:11.695 ********
fatal: [node1.example.com]: FAILED! => {
"changed": false,
"reboot": false
}
MSG:
The WS-Management service cannot process the request because the request contained invalid selectors for the resource. (extended fault data: {'transport_message': 'Bad HTTP response returned from server. Code 500', 'http_status_code': 500, 'wsmanfault_code': '2150858843', 'fault_code': 's:Sender', 'fault_subcode': 'w:InvalidSelectors'})
NO MORE HOSTS LEFT *************************************************************
PLAY RECAP *********************************************************************
...
Я был убежден, что, если не требуется, автоматическая очистка обработчиков должна запускать каждый обработчик только один раз, даже если он был уведомленбольше раз во время игры.
Кто-нибудь видел такое поведение? У меня была вторая роль, с обработчиками, с точно таким же именем. Моей первой мыслью было, что Ansible каким-то образом также назвал этот обработчик, но исключая другую роль, или переименование обработчиков не решило это для меня.
Могут ли обработчики быть чересчур придирчивы ко всему, что вызывает их? Задачи из определенных файлов, например task/main.yml
? Или все уведомления изнутри ONE воспроизводят только триггерные обработчики ONCE?