Запускать обработчики независимо от сбоя задачи?

У меня есть роль Ansible, которая выполняет следующие задачи:

---
 # optionally find the latest version of goss using the GitHub "API"
 - name: detect latest version
   shell: |
    curl -sIS https://github.com/aelsabbahy/goss/releases/latest | \
      tr -d '\r' | \
      grep -oP '(?<=Location:\s).*' | \
      grep -oP '(?<=v)\d+\.\d+\.\d+'
   register: detected_latest
   when: version == "latest"

 - name: set detected version
   set_fact:
     real_version: "{{ detected_latest.stdout.strip() }}"
   when: version == "latest"

 - name: set specified verison
   set_fact:
     real_version: "{{ version }}"
   when: version != "latest"

 # set play facts
 - name: set facts
   set_fact:
     download_url: "https://github.com/aelsabbahy/goss/releases/download/v{{ real_version }}/goss-linux-amd64"

 # create goss directories
 - name: create goss directories
   file: path={{ item }} state=directory
   with_items:
     - /tmp/degoss
     - /tmp/degoss/bin
     - /tmp/degoss/tests
   notify: clean

 # download goss
 - name: install
   get_url:
     url: "{{ download_url }}"
     dest: /tmp/degoss/bin/goss
     mode: 0755

 # deploy test cases
 - name: deploy tests
   copy: src={{ item }} dest=/tmp/degoss/tests/
   with_items: "{{ tests }}"

 # run the tests
 - name: run tests
   goss: executable=/tmp/degoss/bin/goss path="{{ item }}" format="{{ format }}"
   with_fileglob: /tmp/degoss/tests/*.yml

А именно, когда create goss directories запускается, это вызывает clean обработчик:

---
# handlers file for degoss
 - name: clean
   file: path=/tmp/degoss state=absent

Из-за природы моего модуля, я хочу clean Обработчик всегда запускается, даже если другие задачи в роли не выполнены. Из моего беглого тестирования, если run tests происходит сбой, обработчик никогда не вызывается и временные файлы остаются на целевом компьютере.

Есть ли способ из моей роли заставить Ansible запускать этот обработчик независимо от того, что произошло в задачах?

3 ответа

Цитирование главы " Обработчики и ошибки":

Вы можете изменить это поведение с помощью --force-handlers опция командной строки, или путем включения force_handlers: True в пьесе или force_handlers = True в ansible.cfg, Когда обработчики вынуждены, они будут запускаться при получении уведомления, даже если на этом хосте произойдет сбой задачи. (Обратите внимание, что некоторые ошибки могут помешать запуску обработчика, например, недоступность хоста.)

Вот пример того, как запустить force_handlers в плейбуке. Имейте в виду, что если у вас есть задача, которая что-то создает, но может возвращать ошибку даже после того, как создание сработало, уведомление о задаче не запустится и не активирует обработчик.

      ---
  - name: handler test
    hosts: localhost
    gather_facts: false
    force_handlers: true
    tasks:

      - name: Return true
        shell: /bin/true
        notify: test_debug

      - name: test broken task
        shell: /bin/false
        notify: test_debug_2

      - name: this one should not run
        debug:
          msg: blabla
        tags:
          - always # This tag will not work

    handlers:
      - name: test_debug
        debug:
          msg: testing error handling

      - name: test_debug_2
        debug:
          msg: testing error handling 2 this one will note run
    ---
    # tasks file for block
    - name: command 0
      shell: uname -i

    - block:
      - name: command1
        shell: ls /tmp/
      - name: command2
        shell: ls /tmp/momo

  rescue:
  - name: retour arriere ya eu une erreur
    shell: ls -ls
Другие вопросы по тегам