如何继续执行失败的任务后,修复错误的剧本?

在编写和调试安塞尔剧本时,典型的工作流程如下:

  1. ansible-playbook ./main.yaml
  2. 剧本在某些任务上失败了
  3. 修复此任务并重复第1行,等待所有以前的任务再次执行。这需要很多时间

理想情况下,我想恢复执行失败的任务,有库存和所有事实收集以前的任务。这有可能吗?如何使剧本编写/调试更快?

84481 次浏览

看看 执行故障排除剧本。 如果你想开始执行你的剧本在一个特定的任务,你可以这样做与 --start-at-task选项:

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

以上操作将在一个名为 “安装软件包”的任务中开始执行您的剧本。

或者,看看前面的答案 如何在可行的剧本中只运行一个任务?

最后,当一部戏剧失败时,它通常会给你一些东西,大致如下:

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

使用该 --limit命令,它应该从失败的任务重试。

未来读者:

在这种情况下,--limit @/home/user/site.retry不会有帮助,.retry只存储失败的主机,仅此而已,因此只会对失败的主机执行所有任务。

如果您使用的是最新版本(Ansible2.x) ,则 --start-at-task不适用于 roles内部定义的任务。

您可以通过使用 --step标志来达到类似的效果,例如: ansible-playbook playbook.yml --step。在执行每个任务之前,这个步骤会询问您,您可以选择 (N)o/(y)es/(c)ontinue

使用这种方法,您可以在需要时有选择地执行任务,也可以在修复之后从失败的地方继续执行任务。

未来读者:

从 Ansible2.4.2.0开始,--start-at-task可以用于我创建的角色中定义的任务。

有能力的团队不愿意解决这个问题他们建议你保持你的角色幂等,并重播整个发挥,我没有这个时间。在我的角色中,我没有使用大量像@JeremyWhiting 这样的事实,所以对我来说,我可以使用这个 --start-at-task特性。

然而,这仍然是一个手工任务,所以我写了一些可行的 rpm,并添加了一个“简历”功能,遵循以下基本步骤:

  • 通过/etc/anable/ansible.cfg (取消注释 log _ path)启用可变日志
  • 每次运行前清除日志
  • 失败之后,“ Resume”特性将这个日志抓取到最后一行“ TASK”中,并使用 sed 获取“[]”中的内容
  • 然后它简单地调用最后一次运行,使用—— start-at-task = “ $start _ at _ task”
  • 确保您的角色中有“ any _ error _ death: true”,以便在您希望继续执行的失败任务中停止播放

可操作的团队不愿意创建这个基本的(而且非常有用的)特性,因此唯一的选择就是通过一些 bash 脚本将其组合在一起。