Обработка ошибок в Ansible Playbooks
Различные способы обработки сбоев в Ansible
В этой статье мы сосредоточимся на одной из важных тем Ansible — "Обработка ошибок в Ansible Playbooks". К концу этой статьи вы должны обладать достаточными знаниями о обработке ошибок Ansible и о том, как обрабатывать различные ошибки при запуске плейбуков в Ansible в Linux.
Обработка ошибок в Playbooks
Ошибки и ошибки очень распространены в любом программном обеспечении, которое вы используете. Анзибль не является исключением. Когда вы начнете работать над реальным проектом с помощью ansible, вы столкнетесь со всевозможными ошибками, будь то ошибка продукта или человеческая ошибка.
Некоторых ошибок можно избежать, применяя лучшие практики и используя инструменты с функциями проверки и отладки. В этом случае я предлагаю использовать vscode, который имеет отличную экосистему плагинов для поддержки разработки ansible.
Взгляните на следующие расширения vscode, которые позволяют вам реализовать лучшие практики, обеспечивая соблюдение некоторых правил и выявляя основные синтаксические ошибки.
- https://github.com/adrienverge/yamllint
- https://marketplace.visualstudio.com/items?itemName=redhat.ansible
Ниже приведен пример изображения из vscode ansible linter.
Пример вывода Ansible Linter
Теперь давайте рассмотрим несколько сценариев, чтобы понять различные типы сбоев и способы их устранения.
Как обрабатывать синтаксические ошибки в Ansible
Первое, что вам нужно проверить перед запуском любого плейбука, — это синтаксические ошибки. Вы можете использовать флаг "--syntax-check
" вместе с командой ansible-playbook
для проверки синтаксической ошибки.
Взгляните на приведенную ниже книгу. У меня есть две проблемы. Роль ключевого слова не является допустимым ключевым словом. Это должно быть "роли". Вторая проблема заключается в том, что обе роли не являются допустимыми.
---
- name: Handle Failure
hosts: localhost
role:
- sample-role1
- sample-role2
Когда я запускаю плейбук с помощью --syntax-check
, он обнаруживает первую ошибку в плейбуке.
ansible-playbook --syntax-check playbook.yml
Синтаксическая ошибка Ansible 1
Как только я исправлю ошибку и повторно отправлю сценарий, он покажет следующую ошибку: sample-role1 не найден нигде в roles_path
.
Синтаксическая ошибка Ansible 2
Проблема с этим подходом заключается в том, что если у вас есть пара ошибок в плейбуке, он просто покажет первую ошибку, и вам придется исправить ошибки и повторно отправить команду, чтобы увидеть следующую ошибку.
Как обрабатывать сбои задач в Ansible
Прежде чем узнать, как исправить невыполненную задачу, вы должны знать, как ansible отправляет задачи и что происходит, когда задача не выполнена.
Ansible отправляет задачи в определенном порядке пакетами (forks=5). Если на хосте произошла ошибка конкретной задачи, ansible отметит хост и остановит выполнение дальнейших задач на хосте.
Вы можете обработать сбой на уровне задачи, используя любой из приведенных ниже подходов.
- Использование директивы ignore_errors.
- Группировка задач по директиве блока.
1. Обработка ошибок с помощью директивы Ignore_errors
Рассмотрим следующую схему, в которой есть две задачи: загрузить и установить пакет Chrome Deb.
---
- name: Handle Failure with ignore_erros
hosts: localhost
tasks:
- name: Download chrome .deb file
ansible.builtin.get_url:
url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb
dest: /tmp/chrome.deb
- name: Install from /tmp/chrome.deb
ansible.builtin.apt:
deb: /tmp/chrome.deb
Я намеренно указал неправильный URL-адрес, из-за чего первая задача не будет выполнена. Как уже говорилось, если на хосте происходит сбой задачи, дальнейшая задача не будет отправляться на хост. Поэтому второе задание не отправляется.
fatal: [localhost]: FAILED! => {"changed": false, "dest": "/tmp/chrome.deb", "elapsed": 0, "msg": "Request failed", "response": "HTTP Error 404: Not Found", "status_code": 404, "url": "https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb"}
Теперь позвольте мне снова запустить ту же книгу, но с "ignore_errors= true
".
Ansible игнорирует ошибки
Если вы посмотрите на изображение выше, первая задача была запущена и завершилась неудачно, но сбой игнорируется, что привело к запуску второй задачи.
Внимание! Директиву ignore_errors
можно добавить на уровне задачи или уровне воспроизведения.
2. Обработка ошибок с использованием директив Block-Rescue-Always
Иногда группы задач зависят друг от друга, и в случае сбоя одной задачи не следует запускать только зависимую задачу, а не останавливать все задачи на определенных хостах.
Сценарий, использованный в предыдущем разделе, станет прекрасным примером этого сценария. Задача установки зависит от задачи загрузки, поэтому обе задачи можно сгруппировать по директиве блокировки.
---
- name: Handle Failure with ignore_erros
hosts: localhost
tasks:
- name: Group the tasks
block:
- name: Download chrome .deb file
ansible.builtin.get_url:
url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb
dest: /tmp/chrome.deb
- name: Install from /tmp/chrome.deb
ansible.builtin.apt:
deb: /tmp/chrome.deb
ignore_errors: true
Я использовал ту же книгу, но перенес обе задачи в директиву блока и добавил ignore_errors
на уровне блока. Если вы посмотрите на вывод ниже, обе задачи автоматически унаследовали директиву ignore_errors
.
Игнорирование ошибок на уровне блока
Вы также можете добавить директивы "rescue
" и "always
" вместе с "блокировать
" директиву. Задача в соответствии с директивой rescue
будет запущена, если какая-либо из задач в соответствии с директивой block
завершится неудачно. Это очень полезно для уборки. Директива Always выполняется независимо от статуса директив block
и rescue
.
Я добавил директивы rescue
и always
с задачами, которые печатают некоторые сообщения.
tasks:
- name: Group the tasks
block:
- name: Download chrome .deb file
ansible.builtin.get_url:
url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb
dest: /tmp/chrome.deb
- name: Install from /tmp/chrome.deb
ansible.builtin.apt:
deb: /tmp/chrome.deb
rescue:
- name: Rescue task
ansible.builtin.debug:
msg: "Some cleanup activity..."
always:
- name: Task that always runs
ansible.builtin.debug:
msg: "Task that always run"
Задача спасения
была выполнена, поскольку задача в разделе блока не удалась. Наконец, были выполнены задачи always
.
Спасение и всегда директивный вывод
Как остановить все игры в случае неудачи
В последнем разделе мы рассмотрели способы запуска задач, даже если задача не удалась. В некоторых случаях нам нужно, чтобы вся пьеса остановилась, даже если одна задача не удалась. Этого можно добиться, установив "any_errors_fatal: true
".
Остановить выполнение Playbook при любых сбоях
Если книга воспроизведения отправлена с «any_errors_fatal
» и в случае сбоя задачи, задачи, отправленные в текущем пакете, будут запущены, и воспроизведение будет остановлено.
Внимание: Директиву any_errors_fatal
можно установить на уровне игры или на уровне задачи.
Как справиться с ошибкой недостижимого хоста в Ansible
Другой тип ошибки в ansible — "недоступный хост". Вы получите эту ошибку, если ansible не смог подключиться к управляемому хосту, определенному в файле инвентаризации. Это происходит по многим причинам. Возможно, вы указали неправильное определение хоста, либо возникла проблема с управляемым хостом.
Если ansible обнаружит, что узел недоступен, он удалит узел из списка активных хостов и не будет отправлять на него никаких дальнейших задач.
Я использую ту же книгу, что и в предыдущем разделе, но со случайным именем хоста. Задача завершилась неудачно с сообщением "unreachable".
Недоступные хосты Ansible
Вы можете добавить «ignore_unreachable: true
» на уровне задачи или воспроизведения, что позволит пропустить текущую задачу и запустить следующую задачу, не удаляя хост из активного списка.
Ansible игнорирует недоступные хосты
Как создавать определяемые пользователем сбои в Ansible
Помимо определяемых ansible сбоев, пользователи также могут создавать свои собственные правила, предотвращающие сбой задачи, с помощью директивы "failed_when
". Фактически, ansible линтер предлагает использовать директиву «failed_when
» вместо директивы «ignore_errors
».
Вывод Линтера
Вам необходимо зарегистрировать выходные данные задачи, прежде чем выполнять некоторые условные проверки. Имя зарегистрированной переменной: "status
".
Чтобы узнать больше о регистрах Ansible, обратитесь к следующему руководству.
- Переменная регистра Ansible
Я добавил условие для проверки кода состояния зарегистрированного выхода. Код состояния 404 не будет считаться ошибкой. Теперь любой другой код возврата будет считаться неудачным.
- name: Download chrome .deb file
ansible.builtin.get_url:
url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb
dest: /tmp/chrome.deb
register: status
failed_when: status.status_code != 404
Условный отказ в Ansible
Вы также можете добавить операторы И» и ИЛИ» для проверки нескольких условий.
failed_when: status.status_code != 404 or status.status_code != 401
Как обрабатывать сбои задач обработчика в Ansible
У нас есть отдельная статья для обработчиков. Перейдите по следующей ссылке и найдите раздел «Обработка сбоев», чтобы узнать, как обрабатывать сбои в задачах обработчика.
- Как использовать обработчики в Ansible Playbooks
Заключение
В этой статье мы обсудили обработку ошибок в Playbooks. Мы также рассмотрели различные типы сбоев, с которыми вы можете столкнуться в ansible, и некоторые способы их устранения. Обратная связь приветствуется через раздел комментариев.
Ресурс:
- Обработка ошибок в Playbooks