Как запустить ANSIBLE на одном хосте за раз и сломаться при сбое

15

У меня есть сборник игр Ansible, в котором я хочу последовательно обновить несколько нестабильных устройств. Я могу использовать serial:1, но я хочу полностью остановить playbook, если у меня возникнет ошибка, чтобы я мог исправить ее, прежде чем продолжить, вместо того, чтобы накапливать ошибки.

Я также хотел бы перезапустить playbook на том же хосте, на котором остановился. В настоящее время используется Ansible v2.0, но он также может переключиться на более новую версию, если функция такого рода доступна только в более новых версиях.

Питер Тернер
источник

Ответы:

15

Ваша книга воспроизведения остановится, когда произойдет сбой, и вы используете в serial: 1соответствии с документацией .

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

Тем не менее, в сообществе, похоже, есть некоторая путаница по поводу поведения по умолчанию, и, похоже, оно изменилось - или глючило - где-то между 1,8 и 2,1.

Поэтому, если serial: 1этого недостаточно, используйте эту дополнительную настройку:

max_failure_percentage: 0

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

==

Что касается повторной попытки воспроизведения, вы должны увидеть сообщение об ошибке, например:

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

Используйте этот --limitфлаг и при следующем выполнении, ansible-playbookи он продолжит с того места, где он потерпел неудачу.

Повторные файлы будут созданы, если вы не установили их retry_files_enabled = Falseв своей конфигурации.

В качестве альтернативы --start-at-taskможет также работать.

Источники:

https://github.com/ansible/ansible/issues/1663

https://github.com/ansible/ansible/issues/16241

http://docs.ansible.com/ansible/playbooks_delegation.html#rolling-update-batch-size

http://docs.ansible.com/ansible/playbooks_delegation.html#maximum-failure-percentage

http://docs.ansible.com/ansible/intro_configuration.html#retry-files-enabled

http://docs.ansible.com/ansible/playbooks_startnstep.html#start-at-task

Лесной Охотник
источник
1
Если у кого-то есть лучшее представление о том, что произошло с изменением / ошибкой в ​​1.9 и 2.0, пожалуйста, дайте мне знать, и я обновлю этот ответ.
Лесной Охотник
Да, я знаю, что ansible 2.0 продолжит работу на других хостах, если он получит сбои на одном из них. Я думаю, я не думал, что у меня было бы другое поведение, если бы я запускал сериал: 1. Это то, что вы говорите?
Питер Тернер
Правильно, serial: 1 должен иметь такое поведение, и если он не (потому что ??), также добавляет max_failure_percentage: 0. Я бы также предложил обновить Ansible, так как в 2.0 было много ошибок.
Лесной Охотник
На самом деле, столько ошибок, что вам не хватает файлов .retry в 2.0! github.com/ansible/ansible/issues/13944
Лесной охотник
Хех, так что я не единственный, кто постоянно исправляет источник. Это хорошо знать.
Питер Тернер
2

В версии 2.5+ (хорошо после вопроса) есть отладчик, который охватывает большую часть этого: https://docs.ansible.com/ansible/latest/user_guide/playbooks_debugger.html

Что касается по одному, использование «--forks 1» подключается только к одной системе за раз, если вы хотите сделать это ad-hoc, а не каждый раз.

Мэтт Пехота
источник