Обработка ошибок в плейбуках
- Игнорирование неудачных команд
- Сброс недоступных хостов
- Обработчики и ошибки
- Управление определением ошибки
- Переопределение результата "изменено"
- Прерывание плейбука
Ansible обычно имеет значения по умолчанию, которые гарантируют проверку кодов возврата команд и модулей, и он быстро завершает выполнение с ошибкой — принудительно обрабатывая ошибку, если вы не решите иначе.
Иногда команда, возвращающая значение отличное от 0, не является ошибкой. Иногда команде не всегда нужно сообщать, что она «изменила» удалённую систему. Этот раздел описывает, как изменить стандартное поведение Ansible для определённых задач, чтобы поведение вывода и обработки ошибок соответствовало вашим требованиям.
Игнорирование неудачных команд
Новое в версии 0.6.
Обычно плейбуки перестают выполнять дальнейшие шаги на хосте, на котором задача завершилась неудачно. Однако иногда вам нужно продолжить. Для этого напишите задачу, которая выглядит так:
- name: this will not be counted as a failure command: /bin/false ignore_errors: yes
Обратите внимание, что описанная система управляет только значением возврата ошибки конкретной задачи, поэтому, если используется неопределённая переменная или синтаксическая ошибка, всё равно будет выведена ошибка, которую пользователи должны будут обработать. Обратите внимание, что это не предотвратит ошибки при подключении или выполнении.
Сброс недоступных хостов
Новое в версии 2.2.
Ошибки подключения устанавливают хосты как «НЕДОСТУПНЫЕ», что удаляет их из списка активных хостов для выполнения. Для восстановления от этих проблем можно использовать meta: clear_host_errors , чтобы все помеченные хосты были повторно активированы, и последующие задачи могли попытаться использовать их снова.
Обработчики и ошибки
Новое в версии 1.9.1.
Когда задача завершается неудачно на хосте, обработчики, которые были уведомлены ранее, не будут выполнены на этом хосте. Это может привести к случаям, когда несвязанная ошибка может оставить хост в неожиданном состоянии. Например, задача может обновить конфигурационный файл и уведомить обработчик о перезапуске некоторой службы. Если впоследствии в том же плейбуке задача завершится неудачно, служба не будет перезапущена, несмотря на изменение конфигурации.
Вы можете изменить это поведение с помощью команды --force-handlers командной строки или включив force_handlers: True в плейбук, или force_handlers = True в ansible.cfg. При принудительном запуске обработчиков они будут выполнены при уведомлении, даже если задача завершится неудачно на этом хосте. (Обратите внимание, что некоторые ошибки всё ещё могут помешать запуску обработчика, например, если хост станет недоступным.)
Управление определением ошибки
Новое в версии 1.4.
Предположим, что код ошибки команды бессмысленен, и чтобы определить, произошла ли ошибка, на самом деле важно содержимое вывода команды, например, если строка «FAILED» есть в выводе.
Ansible в 1.4 и более поздних версиях предоставляет способ указать это поведение следующим образом:
- 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"
Переопределение результата "изменено"
Новое в версии 1.3.
При выполнении оболочки/команды или другого модуля, он обычно сообщает статус «изменено» в зависимости от того, считает ли он, что он повлиял на состояние машины.
Иногда вам известно, исходя из кода возврата или вывода, что изменений не было, и вы хотите переопределить результат «изменено» таким образом, чтобы он не отображался в отчёте или не вызывал срабатывание обработчиков:
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
- IRC-чат канал #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.4/playbooks_error_handling.html