Ansible обработчик запускается дважды в конце игры - PullRequest
3 голосов
/ 20 октября 2019

У меня есть проблема, которую я не видел раньше. Я запускаю 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?

1 Ответ

0 голосов
/ 05 ноября 2019

Похоже, что вы испытываете поведение, описанное в следующей проблеме:

https://github.com/ansible/ansible/issues/47374

Похоже, что здесь есть оживленная дискуссия:

https://github.com/ansible/ansible/pull/53644

Мне неясно, было ли это решено в последующих выпусках Ansible.

...