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

Ser*_*aev 55 ansible ansible-playbook

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

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

理想情况下,我希望在失败的任务上恢复执行,拥有库存以及之前任务收集的所有事实.它甚至可能吗?如何让剧本编写/调试更快?

Mxx*_*Mxx 42

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

ansible-playbook playbook.yml --start-at-task="install packages"
Run Code Online (Sandbox Code Playgroud)

以上将开始在名为"安装包"的任务中执行您的剧本.

或者,看一下之前的答案如何在ansible playbook中只运行一个任务?

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

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/site.retry
Run Code Online (Sandbox Code Playgroud)

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

  • `.retry`文件只包含失败的主机,它不存储每个主机失败的位置. (25认同)
  • 感谢您提供的选项列表.但是AFAIK --limit会删除已注册的变量和自定义事实,因此它的使用受到限制 (4认同)
  • 选项“--start-at-task”已损坏,因为只有当您在任何剧本中从未使用“when”子句时,if才会起作用。如果播放中的第一个任务为第二个任务注册了其结果,第二个任务通过“when:first.changed”使用它,则如果您从第二个任务开始,则第二个任务将永远不会被执行。通常由第一个任务设置的条件在开始第二个任务时永远不会设置。 (3认同)
  • 从 ansible 2.2.1.0 开始,`--start-at-task` 不适用于角色中定义的任务。https://github.com/ansible/ansible/issues/15735 (2认同)

Seg*_*ted 24

未来的读者:

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

使用此方法,您可以在需要时有选择地执行任务,并在修复后从失败的位置继续执行.