Ansible: выполнение очистки при сбое задачи

В настоящее время я пишу игру Ansible, которая следует этому общему формату и запускается через задание cron:

pre_tasks:
  -Configuration / package installation

tasks:
  -Work with installed packages

post_tasks:
  -Cleanup / uninstall packages

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

Мой текущий подход состоит в том, чтобы применить ignore_errors: yes ко всему в разделе tasks, а затем применить условие when: к каждой задаче, чтобы индивидуально проверить, была ли выполнена предыдущая команда.

Это решение похоже на взлом, но становится еще хуже, потому что даже с установленным ignore_errors: yes, если для задачи возникает фатальная ошибка, все воспроизведение все равно немедленно завершается сбоем, поэтому мне также нужно запустить bash-скрипт cron, чтобы вручную проверить вещи после достижения играть исполнение.

Все, что мне нужно, это гарантия того, что даже если tasks выйдет из строя, post_tasks все равно будет работать. Я уверен, что есть способ сделать это, не прибегая к оболочкам сценариев bash.


person Mark    schedule 26.05.2014    source источник
comment
К сожалению (для вашего варианта использования) post_tasks не предназначен для очистки. Цитируя руководство ansible: предварительные и пост-задачи в значительной степени предназначены для работы с балансировщиками нагрузки. (github.com/ansible/ansible/issues/3869)   -  person Todd Owen    schedule 17.06.2014


Ответы (3)


Не используйте блок post_tasks, а сделайте процесс очистки частью обычного блока tasks.

person Mxx    schedule 27.05.2014
comment
Как это отвечает на вопрос? Если что-то не получается, вы говорите, что каждая задача в вашем плейбуке должна быть ignore_errors: yes, потому что у Ansible нет заметного способа выполнить какую-либо post_cleanup? Разве playbook, по его собственному признанию, не останавливается на первой же ошибке? Как будет запускаться задача очистки? - person Nick Klauer; 01.04.2015
comment
любое решение по этому поводу? - person Zasz; 19.05.2015
comment
@Zasz решение чего? - person Mxx; 19.05.2015
comment
Гарантированное выполнение задания в конце плейбука. Вроде как finally в конце блока try-catch. Я перемещаю свои журналы ansible в другое место в конце выполнения playbook. Мне нужно, чтобы это произошло, даже если playbook не работает. - person Zasz; 20.05.2015
comment
@Zasz Я ищу решение той же проблемы, все текущие решения, которые я нашел, очень хакерские. - person mwhite14; 22.06.2015
comment
В соответствии с этим github.com/ansible/ansible/issues/4443 мы получим это функция в v2. А пока вы можете попробовать использовать плагин обратного вызова, подобный этому gist.github.com/cliffano/9868180 и поместите туда немного логики в качестве обходного пути - person Zasz; 24.06.2015

Эта функция стала доступна в Ansible 2.0:

Это документация для новых маркеров строф block, rescue и always.

person Marc Tamsky    schedule 02.08.2015
comment
Я предлагаю изменить это на принятый ответ, так как принятый в настоящее время ответ неверен, @Mark - person Aaron Lehmann; 06.04.2020