Подтвердить что ты не робот

Как продолжить выполнение неудавшейся задачи после исправления ошибки в playbook?

При написании и отладке Ansible playbooks типичный рабочий процесс выглядит следующим образом:

  • ansible-playbook ./main.yaml
  • Не удалось выполнить загрузку книги.
  • Исправить эту задачу и повторить строку 1, ожидая выполнения всех предыдущих задач. Это занимает много времени.

В идеале, я хотел бы возобновить выполнение неудавшейся задачи, имея инвентарь и все факты, собранные предыдущими задачами. Возможно ли это? Как ускорить запись/отладку плейбуков?

4b9b3361

Ответ 1

Взгляните на http://docs.ansible.com/playbooks_startnstep.html. Если вы хотите начать выполнение своей пьесы по определенной задаче, вы можете сделать это с помощью --start-at-task:

ansible-playbook playbook.yml --start-at-task="install packages"

Вышеупомянутое запустит ваш учебник по заданию с именем "install packages".

В качестве альтернативы, взгляните на этот предыдущий ответ. Как запустить только одну задачу в незанятой пьесе?

Наконец, когда игра терпит неудачу, она обычно дает вам что-то вроде:

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/site.retry

Используйте эту --limit и она должна --limit неудачную задачу.

Ответ 2

Будущие читатели:

--limit @/home/user/site.retry не помог бы в таком сценарии, .retry хранит только недействительный хост и ничего больше, поэтому просто выполнит все задачи против неудавшихся хостов.

Если вы используете последнюю версию (Ansible 2.x), --start-at-task не работает для задач, определенных внутри roles.

Вы можете добиться аналогичного эффекта, просто используя флаг --step, например: ansible-playbook playbook.yml --step. Перед тем, как выполнить каждую задачу, вы попросите шаг, и вы можете выбрать (N)o/(y)es/(c)ontinue.

При таком подходе вы выборочно выполняете задачи, когда это необходимо, а также продолжайте с точки, где она не удалась, после исправления.

Ответ 3

Будущие читатели будущего:

Начиная с Ansible 2.4.2.0 --start-at-task работает для задач, определенных в ролях, которые я создал.

Неспособная команда не желает решать эту проблему, они предполагают, что вы сохраняете свои роли идемпотент и воспроизводите всю игру, у меня нет на это времени. В моих ролях я не использую огромное количество фактов, таких как @JeremyWhiting, поэтому для меня я могу использовать эту --start-at-task.

Тем не менее, это ручная задача, поэтому вместо этого я написал несколько необработанных rpm и добавил функцию "Возобновить", которая следует за этими основными шагами:

  • Включить доступный журнал через /etc/ansible/ansible.cfg(uncomment log_path)
  • Очистить журнал перед каждым запуском
  • После сбоя функция "Возобновить" завершает этот журнал для последней строки "TASK" и использует sed для получения того, что находится внутри "[]",
  • Затем он просто вызывает последнюю попытку запуска, с --start-at-task = "$ start_at_task"
  • Убедитесь, что у вас есть "any_errors_fatal: true" в ваших ролях, чтобы остановить игру при неудачной задаче, которую вы хотите возобновить с

Неспособная команда не желает создавать эту базовую (и очень полезную) функцию, поэтому единственный выбор - взломать ее вместе с помощью некоторых сценариев bash.