Как продолжить выполнение неудавшейся задачи после исправления ошибки в playbook?
При написании и отладке Ansible playbooks типичный рабочий процесс выглядит следующим образом:
-
ansible-playbook ./main.yaml
- Не удалось выполнить загрузку книги.
- Исправить эту задачу и повторить строку 1, ожидая выполнения всех предыдущих задач. Это занимает много времени.
В идеале, я хотел бы возобновить выполнение неудавшейся задачи, имея инвентарь и все факты, собранные предыдущими задачами. Возможно ли это? Как ускорить запись/отладку плейбуков?
Ответы
Ответ 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.