如何在以前的失败之后总是 运行 一些 ansible 角色?
How to always run some ansible roles after previous failures?
我有一套看起来像
的剧本
- name: Run test
hosts: tester
roles:
- { role: setup_repos }
- { role: setup_environment }
- { role: install_packages }
- { role: run_tests }
- { role: collect_logs }
当前的问题是我们在前 4 个角色中都有 ignore_errors: true
这不是一个好的做法,因为它很难读取输出和调试。
ignore_errors
被滥用的唯一原因是因为我们希望能够在最后执行 collect_logs,无论结果如何。
我们如何重构它以删除 ignore_errors 并拥有更多的快速失败策略。
请注意,我们有很多剧本调用 collect_logs 角色,因此 "moving code inside playbook" 并不是真正重用它的方法。
我相信 handlers 和 notify 会帮助你实现你想要的。
您不需要更改您的角色行为(尽管这可能是个好主意)。
您应该在每个角色结束时通知,处理程序只会 运行 一次。
http://docs.ansible.com/ansible/latest/playbooks_intro.html#handlers-running-operations-on-change
此外,如果您选择开始处理错误,您可以使用 --force-handlers
强制执行处理程序,即使 playbook 失败也是如此。
http://docs.ansible.com/ansible/latest/playbooks_error_handling.html#handlers-and-failure
在 ansible 2.4 或更新版本上,应该用 role_include
或 role_import
等任务替换 role:
块,这使您能够使用任务使用的正常逻辑。您可以使用处理程序,ignore_errors,等等。
我有一套看起来像
的剧本- name: Run test
hosts: tester
roles:
- { role: setup_repos }
- { role: setup_environment }
- { role: install_packages }
- { role: run_tests }
- { role: collect_logs }
当前的问题是我们在前 4 个角色中都有 ignore_errors: true
这不是一个好的做法,因为它很难读取输出和调试。
ignore_errors
被滥用的唯一原因是因为我们希望能够在最后执行 collect_logs,无论结果如何。
我们如何重构它以删除 ignore_errors 并拥有更多的快速失败策略。
请注意,我们有很多剧本调用 collect_logs 角色,因此 "moving code inside playbook" 并不是真正重用它的方法。
我相信 handlers 和 notify 会帮助你实现你想要的。 您不需要更改您的角色行为(尽管这可能是个好主意)。
您应该在每个角色结束时通知,处理程序只会 运行 一次。
http://docs.ansible.com/ansible/latest/playbooks_intro.html#handlers-running-operations-on-change
此外,如果您选择开始处理错误,您可以使用 --force-handlers
强制执行处理程序,即使 playbook 失败也是如此。
http://docs.ansible.com/ansible/latest/playbooks_error_handling.html#handlers-and-failure
在 ansible 2.4 或更新版本上,应该用 role_include
或 role_import
等任务替换 role:
块,这使您能够使用任务使用的正常逻辑。您可以使用处理程序,ignore_errors,等等。