Поиск по сайту:

Обработка ошибок в 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

Статьи по данной тематике