it-swarm.com.ru

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

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

  1. ansible-playbook ./main.yaml
  2. Playbook не справляется с какой-либо задачей
  3. Исправьте эту задачу и повторите строку 1, ожидая повторного выполнения всех предыдущих задач. Что занимает много времени

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

50
Sergey Alaev

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

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

Вышеприведенное начнет выполнение вашей книги с заданием "установить пакеты" .

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

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

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

Используйте эту команду --limit, и она должна повторить попытку с ошибкой.

39
Mxx

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

--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.

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

21
Segmented

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

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

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

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

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

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

1
Trent