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