在playbook中修复错误后如何继续执行失败的任务?

时间:2015-04-27 15:37:06

标签: ansible ansible-playbook

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

  1. connector = new TransportConnector(); connector.setUri(new URI("mqtt://localhost:1883")); connector.setName("MQTTConn"); broker.addConnector(connector); connector = new TransportConnector(); connector.setUri(new URI("ws://localhost:1884")); connector.setName("WSConn"); broker.addConnector(connector);
  2. Playbook在某些任务上失败
  3. 修复此任务并重复第1行,等待所有先前的任务再次执行。这花了很多时间
  4. 理想情况下,我希望在失败的任务上恢复执行,拥有库存以及之前任务收集的所有事实。它甚至可能吗?如何更快地进行剧本编写/调试?

3 个答案:

答案 0 :(得分:39)

看看http://docs.ansible.com/playbooks_startnstep.html。 如果您想在特定任务中开始执行您的剧本,可以使用--start-at-task选项执行此操作:

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

以上内容将开始在名为“install packages”的任务中执行您的剧本。

或者,请查看以前的答案How to run only one task in ansible playbook?

最后,当一个游戏失败时,它通常会给你一些类似的东西:

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

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

答案 1 :(得分:21)

未来的读者:

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

使用这种方法,您可以在需要时有选择地执行任务,并在修复后从故障点继续执行。

答案 2 :(得分:1)

未来的未来读者:

从Ansible 2.4.2.0开始,--start-at-task适用于在我创建的角色中定义的任务。

愤怒的团队不愿意解决这个问题,他们建议您保持角色等幂并重演整个剧本,我没有时间这样做。在我的角色中,我并没有使用@JeremyWhiting之类的大量事实,因此对于我来说,我可以使用此--start-at-task功能。

但是,这仍然是手动任务,因此我写了一些ansible rpm并添加了遵循以下基本步骤的“恢复”功能:

  • 通过/etc/ansible/ansible.cfg(取消注释log_path)启用ansible日志
  • 在每次运行前清除日志
  • 失败后,“恢复”功能会将此日志保留到最后的“任务”行,并使用sed来获取“ []”内部的内容。
  • 然后,它仅使用--start-at-task =“ $ start_at_task”
  • 调用最后一次运行播放
  • 确保您的角色具有“ any_errors_fatal:true”,以在您希望从中恢复的失败任务中停止播放

Ansible团队不愿意创建此基本(且非常有用)功能,因此唯一的选择是通过一些bash脚本将其合并在一起。