Обработка ошибок в плейбуках
- Игнорирование неудачных команд
- Сброс недоступных хостов
- Обработчики и ошибки
- Управление определением ошибки
- Переопределение результата "изменено"
- Прерывание плейбука
Ansible обычно имеет значения по умолчанию, которые гарантируют проверку кодов возврата команд и модулей, и он быстро завершается с ошибкой – заставляя обработать ошибку, если вы не решите иначе.
Иногда команда, возвращающая значение отличное от 0, не является ошибкой. Иногда команде не всегда нужно сообщать, что она «изменила» удалённую систему. Этот раздел описывает, как изменить поведение Ansible по умолчанию для определённых задач, чтобы поведение вывода и обработки ошибок соответствовало желаемому.
Игнорирование неудачных команд
В целом, плейбуки прекращают выполнение дальнейших шагов на хосте, на котором задача завершилась неудачно. Однако иногда нужно продолжить выполнение. Для этого напишите задачу, которая выглядит так:
- name: this will not be counted as a failure command: /bin/false ignore_errors: yes
Обратите внимание, что вышеуказанная система управляет только значением возврата ошибки конкретной задачи, поэтому если используется неопределённая переменная или синтаксическая ошибка, всё равно будет выдаваться ошибка, которую пользователи должны будут устранить. Обратите внимание, что это не предотвратит ошибки при подключении или выполнении. Эта функция работает только в том случае, если задача должна быть выполнена и вернуть значение «failed».
Сброс недоступных хостов
Новое в версии 2.2.
Неудачные подключения устанавливают хосты как «НЕДОСТУПНЫЕ», что удалит их из списка активных хостов для выполнения. Чтобы восстановиться от этих проблем, вы можете использовать meta: clear_host_errors для повторной активации всех хостов, которые в данный момент помечены как недоступные, чтобы последующие задачи могли снова использовать их.
Обработчики и ошибки
Когда задача завершается неудачно на хосте, обработчики, которые ранее были уведомлены, не будут запущены на этом хосте. Это может привести к ситуациям, когда несвязанная ошибка может оставить хост в неожиданном состоянии. Например, задача может обновить конфигурационный файл и уведомить обработчик о перезапуске некоторой службы. Если впоследствии в том же плейбуке какая-либо задача завершится неудачно, служба не будет перезапущена, несмотря на изменения конфигурации.
Вы можете изменить это поведение с помощью команды --force-handlers , или включив force_handlers: True в плейбуке, или force_handlers = True в ansible.cfg. Принудительное выполнение обработчиков гарантирует их запуск при уведомлении, даже если задача на этом хосте завершается неудачно. (Обратите внимание, что некоторые ошибки всё ещё могут помешать запуску обработчика, например, если хост станет недоступным.)
Управление определением ошибки
Предположим, что код ошибки команды бессмыслен и чтобы определить, произошла ли ошибка, имеет значение только вывод команды, например, если в выводе содержится строка «FAILED».
Ansible предоставляет способ указать это поведение следующим образом:
- name: Fail task when the command error output prints FAILED command: /usr/bin/example-command -x -y -z register: command_result failed_when: "'FAILED' in command_result.stderr"
или на основе кода возврата:
- name: Fail task when both files are identical raw: diff foo/file1 bar/file2 register: diff_cmd failed_when: diff_cmd.rc == 0 or diff_cmd.rc >= 2
В предыдущих версиях Ansible это можно было сделать следующим образом:
- name: this command prints FAILED when it fails
command: /usr/bin/example-command -x -y -z
register: command_result
ignore_errors: True
- name: fail the play if the previous command did not succeed
fail:
msg: "the command failed"
when: "'FAILED' in command_result.stderr"
Переопределение результата "изменено"
Когда выполняется shell/команда или другой модуль, он обычно сообщает о статусе «изменено» на основе того, считает ли он, что повлиял на состояние машины.
Иногда вы знаете, исходя из кода возврата или вывода, что изменений не было, и хотите переопределить результат «изменено», чтобы он не отображался в отчёте или не вызывал обработчики:
tasks:
- shell: /usr/bin/billybass --mode="take me to the river"
register: bass_result
changed_when: "bass_result.rc != 2"
# this will never report 'changed' status
- shell: wall 'beep'
changed_when: False
Прерывание плейбука
Иногда желательно прервать весь плейбук при ошибке, а не просто пропустить оставшиеся задачи для хоста.
Параметр плейбука any_errors_fatal отметит все хосты как завершившиеся неудачно, если какой-либо из них завершится неудачно, что приведёт к немедленному прерыванию:
- hosts: somehosts
any_errors_fatal: true
roles:
- myrole
Для более точного управления можно использовать max_fail_percentage для прерывания выполнения после того, как определённый процент хостов завершится неудачно.
См. также
- Работа с плейбуками
- Введение в плейбуки
- Рекомендации
- Рекомендации по плейбукам
- Условные операторы
- Условные операторы в плейбуках
- Использование переменных
- Всё о переменных
- Список рассылки пользователей
- Есть вопрос? Обратитесь к группе Google!
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.7/user_guide/playbooks_error_handling.html